面板在 Java Swing 中填充窗口

问题描述

我在一个窗口中添加了两个 10x10 的网格,但我无法让它们以较小的尺寸显示。他们只是填满了整个窗口。如何将它们以较小的尺寸整齐地放在中间,以便为一些标签和按钮留出空间?我已粘贴以下代码以供参考。

public static void main(String[] args) {
    window = new JFrame();
    window.setTitle("Battleship.exe");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setPreferredSize(new Dimension(600,600));
    
    P1_container = new JPanel(new GridLayout(10,10));
    P1_container.setBorder(BorderFactory.createLineBorder(Color.black,5));
    
    compContainer = new JPanel(new GridLayout(10,10));
    compContainer.setBorder(BorderFactory.createLineBorder(Color.black,5));
    
    grid = new JPanel[10][10];
    for (int i =0; i< 10; i++) {
        for (int j =0; j< 10; j++) {
            grid[i][j] = new JPanel();
            grid[i][j].setBackground(Color.white);
            grid[i][j].setBorder(BorderFactory.createLineBorder(Color.blue,2));
            grid[i][j].setPreferredSize(new Dimension(25,25));
            P1_container.add(grid[i][j]);
        }
    }
    
    enemyGrid = new JPanel[10][10];
    for (int i =0; i< 10; i++) {
        for (int j =0; j< 10; j++) {
            enemyGrid[i][j] = new JPanel();
            enemyGrid[i][j].setBackground(Color.white);
            enemyGrid[i][j].setBorder(BorderFactory.createLineBorder(Color.red,2));
            enemyGrid[i][j].setPreferredSize(new Dimension(25,25));
            compContainer.add(enemyGrid[i][j]);
        }
    }
    
    GridLayout layout = new GridLayout(1,2);
    layout.setHgap(150);
    mainPanel = new JPanel(layout); 
    
    mainPanel.add(P1_container);
    mainPanel.add(compContainer);
    
    window.add(mainPanel);
    window.pack();
    window.setVisible(true);
}

解决方法

您的代码有 24 个编译错误。修复编译错误后,我修改了一行并注释掉了一行以获得此 GUI。

Battleship GUI

这是完整的可运行代码。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BattleshipGUI {
    
    public static void main(String[] args) {
        JFrame window = new JFrame();
        window.setTitle("Battleship.exe");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//      window.setPreferredSize(new Dimension(600,600));
        
        JPanel P1_container = new JPanel(new GridLayout(10,10));
        P1_container.setBorder(BorderFactory.createLineBorder(Color.black,5));
        
        JPanel compContainer = new JPanel(new GridLayout(10,10));
        compContainer.setBorder(BorderFactory.createLineBorder(Color.black,5));
        
        JPanel[][] grid = new JPanel[10][10];
        for (int i =0; i< 10; i++) {
            for (int j =0; j< 10; j++) {
                grid[i][j] = new JPanel();
                grid[i][j].setBackground(Color.white);
                grid[i][j].setBorder(BorderFactory.createLineBorder(Color.blue,2));
                grid[i][j].setPreferredSize(new Dimension(25,25));
                P1_container.add(grid[i][j]);
            }
        }
        
        JPanel[][] enemyGrid = new JPanel[10][10];
        for (int i =0; i< 10; i++) {
            for (int j =0; j< 10; j++) {
                enemyGrid[i][j] = new JPanel();
                enemyGrid[i][j].setBackground(Color.white);
                enemyGrid[i][j].setBorder(BorderFactory.createLineBorder(Color.red,2));
                enemyGrid[i][j].setPreferredSize(new Dimension(25,25));
                compContainer.add(enemyGrid[i][j]);
            }
        }
        
        GridLayout layout = new GridLayout(0,2);
        layout.setHgap(150);
        JPanel mainPanel = new JPanel(layout); 
        
        mainPanel.add(P1_container);
        mainPanel.add(compContainer);
        
        window.add(mainPanel);
        window.pack();
        window.setVisible(true);
    }

}
,

使用 Swing 布局管理器的关键是嵌套容器。

将 mainPanel 嵌套到另一个 JPanel 中,该 JPanel 使用可帮助您实现目标的布局,例如将 mainPanel 置于 BorderLayout.CENTER 位置的 BorderLayout。然后将其他 gui 组件添加到其他 BorderLayout 位置的相同外部 JPanel 中。

如果您不希望 mainPanel 展开,则使用不同的不展开的外部布局,例如 FlowLayout。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...