Java Swing API-GroupLayout未正确调整所有组件JPanel的大小

Java Swing API-GroupLayout未正确调整所有组件JPanel的大小,java,swing,layout-manager,grouplayout,Java,Swing,Layout Manager,Grouplayout,我昨天才开始使用JavaSwing,所以如果这不是一个有效的问题,请原谅。我一直在尝试创建一个简单的UI,其中包含一个网格和一个面板,允许用户指定网格维度的大小 我有两个扩展JPanel的类:GridSizePanel和GridBoxPanelGridSizePanel指定设计允许用户更改尺寸的面板时涉及的标题、边框、标签和字段网格框面板显示实际网格(采用自)GridSizePanel使用GroupLayout作为其布局管理器,GridBoxPanel使用GridBagLayout。编排这些子面

我昨天才开始使用JavaSwing,所以如果这不是一个有效的问题,请原谅。我一直在尝试创建一个简单的UI,其中包含一个网格和一个面板,允许用户指定网格维度的大小

我有两个扩展JPanel的类:
GridSizePanel
GridBoxPanel
GridSizePanel
指定设计允许用户更改尺寸的面板时涉及的标题、边框、标签和字段<代码>网格框面板显示实际网格(采用自)
GridSizePanel
使用GroupLayout作为其布局管理器,
GridBoxPanel
使用GridBagLayout。编排这些子面板的父JFrame类(
MazeSolverInterface
)使用GroupLayout作为其LayoutManager

问题是,如果我只将
GridSizePanel
添加到
MazeSolverInterface
的组布局中,当我手动调整窗口大小时,我可以看到
GridSizePanel
自动调整大小。一切都好

但是,当我将
GridBoxPanel
添加到
MazeSolverInterface
时,现在当我手动调整窗口大小时,似乎只有
GridBoxPanel
会调整大小。
GridSizePanel
根本不会更改维度

以下是我目前的代码:

GridSizePanel:

public class GridSizePanel extends JPanel implements PropertyChangeListener {


    public GridSizePanel() throws ParseException {

        // set the border properties
        TitledBorder title = BorderFactory.createTitledBorder("Grid Size");
        title.setTitleColor(Color.BLACK);
        title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
                Color.DARK_GRAY, Color.GRAY));
        this.setBorder(title);

        // wire up the group layout and panel to
        // each other
        GroupLayout gl = new GroupLayout(this);
        this.setLayout(gl);

        // Turn on automatically adding gaps between components
        gl.setAutoCreateGaps(true);

        // Turn on automatically creating gaps between components that touch
        // the edge of the container and the container.
        gl.setAutoCreateContainerGaps(true);

        JLabel numRowsLabel = new JLabel("rows");
        JLabel numColsLabel = new JLabel("columns");

        MaskFormatter textMask = new MaskFormatter("##");
        textMask.setPlaceholder("16");
        JFormattedTextField rowsText = new JFormattedTextField(textMask);
        JFormattedTextField colsText = new JFormattedTextField(textMask);

        // configure the text fields
        rowsText.setColumns(50);
        colsText.setColumns(50);
        rowsText.addPropertyChangeListener("value", this);
        colsText.addPropertyChangeListener("value", this);

        GroupLayout.SequentialGroup horGroup = gl.createSequentialGroup();
        horGroup.addGroup(gl.createParallelGroup().addComponent(numRowsLabel).addComponent(numColsLabel))
                .addGroup(gl.createParallelGroup().addComponent(rowsText).addComponent(colsText));
        gl.setHorizontalGroup(horGroup);

        GroupLayout.SequentialGroup verGroup = gl.createSequentialGroup();
        verGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numRowsLabel).addComponent(rowsText))
                .addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numColsLabel).addComponent(colsText));
        gl.setVerticalGroup(verGroup);
    }

    //public GridSize getSize() {
    //    return new GridSize()
    //}

    @Override
    public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
        // TODO: fill this with logic to relay grid dimensions to the model
    }
}
public class GridBoxPanel extends JPanel {

    public GridBoxPanel() {
        setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        for (int row = 0; row < 32; row++) {
            for (int col = 0; col < 32; col++) {
                gbc.gridx = col;
                gbc.gridy = row;

                GridCell gridCell = new GridCell();
                Border border = null;
                if (row < 4) {
                    if (col < 4) {
                        border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
                    } else {
                        border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
                    }
                } else {
                    if (col < 4) {
                        border = new MatteBorder(1, 1, 1, 0, Color.GRAY);
                    } else {
                        border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
                    }
                }
                gridCell.setBorder(border);
                add(gridCell, gbc);
            }
        }
    }
}
public class MazeSolverInterface extends JFrame {

    public MazeSolverInterface(String[] args) throws ParseException {
        checkArgs(args);
        initMaze(args);
    }

    public void initMaze(String[] args) throws ParseException {
        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        // create required panels to integrate
        GridSizePanel gridSizeComponent = new GridSizePanel();
        GridBoxPanel gridDrawComponent = new GridBoxPanel();

        gl.setHorizontalGroup(gl.createSequentialGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
        gl.setVerticalGroup(gl.createParallelGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
        pack();

        setTitle("v0.0.1");
        setSize(700, 700);  // TODO: change to something configurable
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void checkArgs(String[] args) {
        // TODO: fill with logic to check valid arguments (initial window dimensions)
    }
}
public class Main {

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MazeSolverInterface ex = null;
                try {
                    ex = new MazeSolverInterface(args);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                ex.setVisible(true);
            }
        });
    }
}
public class GridCell extends JPanel {

    private Color defaultBackground;

    public GridCell() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                defaultBackground = getBackground();
                setBackground(Color.BLUE);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(defaultBackground);
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(50, 50);
    }
}
GridBoxPanel:

public class GridSizePanel extends JPanel implements PropertyChangeListener {


    public GridSizePanel() throws ParseException {

        // set the border properties
        TitledBorder title = BorderFactory.createTitledBorder("Grid Size");
        title.setTitleColor(Color.BLACK);
        title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
                Color.DARK_GRAY, Color.GRAY));
        this.setBorder(title);

        // wire up the group layout and panel to
        // each other
        GroupLayout gl = new GroupLayout(this);
        this.setLayout(gl);

        // Turn on automatically adding gaps between components
        gl.setAutoCreateGaps(true);

        // Turn on automatically creating gaps between components that touch
        // the edge of the container and the container.
        gl.setAutoCreateContainerGaps(true);

        JLabel numRowsLabel = new JLabel("rows");
        JLabel numColsLabel = new JLabel("columns");

        MaskFormatter textMask = new MaskFormatter("##");
        textMask.setPlaceholder("16");
        JFormattedTextField rowsText = new JFormattedTextField(textMask);
        JFormattedTextField colsText = new JFormattedTextField(textMask);

        // configure the text fields
        rowsText.setColumns(50);
        colsText.setColumns(50);
        rowsText.addPropertyChangeListener("value", this);
        colsText.addPropertyChangeListener("value", this);

        GroupLayout.SequentialGroup horGroup = gl.createSequentialGroup();
        horGroup.addGroup(gl.createParallelGroup().addComponent(numRowsLabel).addComponent(numColsLabel))
                .addGroup(gl.createParallelGroup().addComponent(rowsText).addComponent(colsText));
        gl.setHorizontalGroup(horGroup);

        GroupLayout.SequentialGroup verGroup = gl.createSequentialGroup();
        verGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numRowsLabel).addComponent(rowsText))
                .addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numColsLabel).addComponent(colsText));
        gl.setVerticalGroup(verGroup);
    }

    //public GridSize getSize() {
    //    return new GridSize()
    //}

    @Override
    public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
        // TODO: fill this with logic to relay grid dimensions to the model
    }
}
public class GridBoxPanel extends JPanel {

    public GridBoxPanel() {
        setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        for (int row = 0; row < 32; row++) {
            for (int col = 0; col < 32; col++) {
                gbc.gridx = col;
                gbc.gridy = row;

                GridCell gridCell = new GridCell();
                Border border = null;
                if (row < 4) {
                    if (col < 4) {
                        border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
                    } else {
                        border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
                    }
                } else {
                    if (col < 4) {
                        border = new MatteBorder(1, 1, 1, 0, Color.GRAY);
                    } else {
                        border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
                    }
                }
                gridCell.setBorder(border);
                add(gridCell, gbc);
            }
        }
    }
}
public class MazeSolverInterface extends JFrame {

    public MazeSolverInterface(String[] args) throws ParseException {
        checkArgs(args);
        initMaze(args);
    }

    public void initMaze(String[] args) throws ParseException {
        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        // create required panels to integrate
        GridSizePanel gridSizeComponent = new GridSizePanel();
        GridBoxPanel gridDrawComponent = new GridBoxPanel();

        gl.setHorizontalGroup(gl.createSequentialGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
        gl.setVerticalGroup(gl.createParallelGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
        pack();

        setTitle("v0.0.1");
        setSize(700, 700);  // TODO: change to something configurable
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void checkArgs(String[] args) {
        // TODO: fill with logic to check valid arguments (initial window dimensions)
    }
}
public class Main {

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MazeSolverInterface ex = null;
                try {
                    ex = new MazeSolverInterface(args);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                ex.setVisible(true);
            }
        });
    }
}
public class GridCell extends JPanel {

    private Color defaultBackground;

    public GridCell() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                defaultBackground = getBackground();
                setBackground(Color.BLUE);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(defaultBackground);
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(50, 50);
    }
}
Main:

public class GridSizePanel extends JPanel implements PropertyChangeListener {


    public GridSizePanel() throws ParseException {

        // set the border properties
        TitledBorder title = BorderFactory.createTitledBorder("Grid Size");
        title.setTitleColor(Color.BLACK);
        title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
                Color.DARK_GRAY, Color.GRAY));
        this.setBorder(title);

        // wire up the group layout and panel to
        // each other
        GroupLayout gl = new GroupLayout(this);
        this.setLayout(gl);

        // Turn on automatically adding gaps between components
        gl.setAutoCreateGaps(true);

        // Turn on automatically creating gaps between components that touch
        // the edge of the container and the container.
        gl.setAutoCreateContainerGaps(true);

        JLabel numRowsLabel = new JLabel("rows");
        JLabel numColsLabel = new JLabel("columns");

        MaskFormatter textMask = new MaskFormatter("##");
        textMask.setPlaceholder("16");
        JFormattedTextField rowsText = new JFormattedTextField(textMask);
        JFormattedTextField colsText = new JFormattedTextField(textMask);

        // configure the text fields
        rowsText.setColumns(50);
        colsText.setColumns(50);
        rowsText.addPropertyChangeListener("value", this);
        colsText.addPropertyChangeListener("value", this);

        GroupLayout.SequentialGroup horGroup = gl.createSequentialGroup();
        horGroup.addGroup(gl.createParallelGroup().addComponent(numRowsLabel).addComponent(numColsLabel))
                .addGroup(gl.createParallelGroup().addComponent(rowsText).addComponent(colsText));
        gl.setHorizontalGroup(horGroup);

        GroupLayout.SequentialGroup verGroup = gl.createSequentialGroup();
        verGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numRowsLabel).addComponent(rowsText))
                .addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numColsLabel).addComponent(colsText));
        gl.setVerticalGroup(verGroup);
    }

    //public GridSize getSize() {
    //    return new GridSize()
    //}

    @Override
    public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
        // TODO: fill this with logic to relay grid dimensions to the model
    }
}
public class GridBoxPanel extends JPanel {

    public GridBoxPanel() {
        setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        for (int row = 0; row < 32; row++) {
            for (int col = 0; col < 32; col++) {
                gbc.gridx = col;
                gbc.gridy = row;

                GridCell gridCell = new GridCell();
                Border border = null;
                if (row < 4) {
                    if (col < 4) {
                        border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
                    } else {
                        border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
                    }
                } else {
                    if (col < 4) {
                        border = new MatteBorder(1, 1, 1, 0, Color.GRAY);
                    } else {
                        border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
                    }
                }
                gridCell.setBorder(border);
                add(gridCell, gbc);
            }
        }
    }
}
public class MazeSolverInterface extends JFrame {

    public MazeSolverInterface(String[] args) throws ParseException {
        checkArgs(args);
        initMaze(args);
    }

    public void initMaze(String[] args) throws ParseException {
        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        // create required panels to integrate
        GridSizePanel gridSizeComponent = new GridSizePanel();
        GridBoxPanel gridDrawComponent = new GridBoxPanel();

        gl.setHorizontalGroup(gl.createSequentialGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
        gl.setVerticalGroup(gl.createParallelGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
        pack();

        setTitle("v0.0.1");
        setSize(700, 700);  // TODO: change to something configurable
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void checkArgs(String[] args) {
        // TODO: fill with logic to check valid arguments (initial window dimensions)
    }
}
public class Main {

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MazeSolverInterface ex = null;
                try {
                    ex = new MazeSolverInterface(args);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                ex.setVisible(true);
            }
        });
    }
}
public class GridCell extends JPanel {

    private Color defaultBackground;

    public GridCell() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                defaultBackground = getBackground();
                setBackground(Color.BLUE);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(defaultBackground);
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(50, 50);
    }
}
以下是将GridBoxLabel添加到MazeSolverInterface之前的UI外观:

…将GridBoxLabel添加到MazeSolverInterface后:

非常感谢您的帮助。谢谢大家!

编辑: 如上所示,
GridBoxPanel
使用
GridCell
类。我忘了把它加到这篇文章里,所以在这里。希望这有帮助

GridCell:

public class GridSizePanel extends JPanel implements PropertyChangeListener {


    public GridSizePanel() throws ParseException {

        // set the border properties
        TitledBorder title = BorderFactory.createTitledBorder("Grid Size");
        title.setTitleColor(Color.BLACK);
        title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
                Color.DARK_GRAY, Color.GRAY));
        this.setBorder(title);

        // wire up the group layout and panel to
        // each other
        GroupLayout gl = new GroupLayout(this);
        this.setLayout(gl);

        // Turn on automatically adding gaps between components
        gl.setAutoCreateGaps(true);

        // Turn on automatically creating gaps between components that touch
        // the edge of the container and the container.
        gl.setAutoCreateContainerGaps(true);

        JLabel numRowsLabel = new JLabel("rows");
        JLabel numColsLabel = new JLabel("columns");

        MaskFormatter textMask = new MaskFormatter("##");
        textMask.setPlaceholder("16");
        JFormattedTextField rowsText = new JFormattedTextField(textMask);
        JFormattedTextField colsText = new JFormattedTextField(textMask);

        // configure the text fields
        rowsText.setColumns(50);
        colsText.setColumns(50);
        rowsText.addPropertyChangeListener("value", this);
        colsText.addPropertyChangeListener("value", this);

        GroupLayout.SequentialGroup horGroup = gl.createSequentialGroup();
        horGroup.addGroup(gl.createParallelGroup().addComponent(numRowsLabel).addComponent(numColsLabel))
                .addGroup(gl.createParallelGroup().addComponent(rowsText).addComponent(colsText));
        gl.setHorizontalGroup(horGroup);

        GroupLayout.SequentialGroup verGroup = gl.createSequentialGroup();
        verGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numRowsLabel).addComponent(rowsText))
                .addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numColsLabel).addComponent(colsText));
        gl.setVerticalGroup(verGroup);
    }

    //public GridSize getSize() {
    //    return new GridSize()
    //}

    @Override
    public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
        // TODO: fill this with logic to relay grid dimensions to the model
    }
}
public class GridBoxPanel extends JPanel {

    public GridBoxPanel() {
        setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        for (int row = 0; row < 32; row++) {
            for (int col = 0; col < 32; col++) {
                gbc.gridx = col;
                gbc.gridy = row;

                GridCell gridCell = new GridCell();
                Border border = null;
                if (row < 4) {
                    if (col < 4) {
                        border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
                    } else {
                        border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
                    }
                } else {
                    if (col < 4) {
                        border = new MatteBorder(1, 1, 1, 0, Color.GRAY);
                    } else {
                        border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
                    }
                }
                gridCell.setBorder(border);
                add(gridCell, gbc);
            }
        }
    }
}
public class MazeSolverInterface extends JFrame {

    public MazeSolverInterface(String[] args) throws ParseException {
        checkArgs(args);
        initMaze(args);
    }

    public void initMaze(String[] args) throws ParseException {
        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        // create required panels to integrate
        GridSizePanel gridSizeComponent = new GridSizePanel();
        GridBoxPanel gridDrawComponent = new GridBoxPanel();

        gl.setHorizontalGroup(gl.createSequentialGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
        gl.setVerticalGroup(gl.createParallelGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
        pack();

        setTitle("v0.0.1");
        setSize(700, 700);  // TODO: change to something configurable
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void checkArgs(String[] args) {
        // TODO: fill with logic to check valid arguments (initial window dimensions)
    }
}
public class Main {

    public static void main(final String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MazeSolverInterface ex = null;
                try {
                    ex = new MazeSolverInterface(args);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                ex.setVisible(true);
            }
        });
    }
}
public class GridCell extends JPanel {

    private Color defaultBackground;

    public GridCell() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                defaultBackground = getBackground();
                setBackground(Color.BLUE);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                setBackground(defaultBackground);
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(50, 50);
    }
}

GroupLayout
确实是为GUI工具创建的,但是,它可以 手动使用时没有问题。从内置管理器来看,这是一个 我建议您使用

我对您的示例进行了一些修改:

MazeSolverInterface.java

我已经摆脱了GridSizePanel,并将代码移动到MazeSolverInterface中。从设计的角度来看,如果没有其他具体要求,则不需要有标题的面板 面板。标签是右对齐的。文本字段和迷宫对象在 窗口已调整大小

setSize()
方法被删除,因为它更倾向于使用
pack()
方法。 您可以使用其中一个,但不能同时使用两个

GridBoxPanel.java

导入java.awt.Color;
导入java.awt.GridLayout;
导入javax.swing.JPanel;
导入javax.swing.border.border;
导入javax.swing.border.MatteBorder;
公共类GridBoxPanel扩展了JPanel{
公共GridBoxPanel(){
setLayout(新的GridLayout(32,32,1,1));
用于(int行=0;行<32;行++){
for(int col=0;col<32;col++){
GridCell GridCell=新GridCell();
Border=null;
如果(第4行){
if(col<4){
边框=新的蒙版边框(1,1,0,0,颜色为灰色);
}否则{
边框=新的蒙版边框(1,1,0,1,颜色为灰色);
}
}否则{
if(col<4){
边框=新的蒙版边框(1,1,1,0,颜色为灰色);
}否则{
边框=新的蒙版边框(1,1,1,1,颜色为灰色);
}
}
gridCell.setboorder(边框);
添加(网格单元);
}
}
}
}
这里我使用了
GridLayout
管理器,而不是
gridbagloayout
。(可能是 只有我在
GridLayout
中找到的第三个示例有用。) 我做了这个修改,使事情变得更简单,但我个人不会使用
GridLayout
使用
GroupLayout
migloayout
管理器创建完整的解决方案。 (
GridLayout
不可移植,因为它以像素为单位设置边距。这是不可移植的 最佳,因为我们选择的固定空间并非在所有屏幕分辨率上都是正确的。 在小屏幕上正常,在大屏幕上不正常。一般来说,我们应该避免 以像素为单位设置尺寸。这也适用于重写的
getPreferredSize()
方法。)


您不能手动使用GroupLayout。GroupLayout是为GUI生成器工具设计的。手动使用GroupLayout对任何人来说都是非常困难和容易出错的。如果你想使用GroupLayout,你可以使用任何GUI构建器。你的意思是,如果我从上面的代码中删除任何/所有GroupLayout依赖项并重新运行,我的大小调整问题就会消失吗?那肯定会起作用。是您的面板和组布局造成了问题,这是因为您试图手动实现组布局。如果您仍然想手动使用GroupLayout,那么请关闭所有
autoCreate…Gaps()
,并根据需要手动添加containerGap(…)。只有这样,才能调整GroupLayout面板的大小。要解决布局问题,使用BorderLayout是最简单的方法。一个面板“中间”,另一个面板“右边”。(如果我理解你的布局正确的话)谢谢你的评论!我不打算回答这个问题,因为我自己还没有找到它,但发现了一个bug:在GridCell中,我将首选大小设置为50x50。对于32x32的网格,沿一维方向为1600。但在MazeSolverInterface中,单面只有700!这就是为什么迷宫这么小,而且在中心。我将getPreferredSize改为15x15,现在看起来好多了。调整尺寸的问题似乎也因此消失了。我还要补充一点