Swing:是否忽略了JPanel“ setSize”?

问题描述 投票:0回答:1

所以在我的程序中,buttonPanel.setSize似乎不起作用:

public class View extends JFrame {

private JButton[] button = new JButton[16];
private JPanel buttonPanel;

public View() {
    super();
    init();
}

public void init() {
    setTitle("Memory-Game");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(750, 500);
    setResizable(false);
    setLocationRelativeTo(null);
    getContentPane().setLayout(new BorderLayout());

    buttonPanel = new JPanel(new GridLayout(4, 4, 5, 5));
    for (int x = 0; x < 16; x++) {
        button[x] = new JButton();
        buttonPanel.add(button[x]);
    }
    buttonPanel.setSize(315, 315);
    getContentPane().add(buttonPanel, BorderLayout.CENTER);

    setVisible(true);
}

public static void main(String[] args) {
    new View();
}

虽然JFrame的大小为750x500,但我希望buttonPanel中心仅占据315x315的空间。但是,buttonPanel会在整个JFrame上延伸。

buttonPanel.setSize(315, 315);

我该如何解决?

java swing jframe jpanel jbutton
1个回答
0
投票

但是,buttonPanel会在整个JFrame上延伸。

正确。这是BorderLayout的规则。添加到CENTER的任何组件都将占用框架中的所有可用空间。

并且GridLayout也将增加以占用所有可用空间。

我希望buttonPanel中心仅占据315x315的空间。

不要尝试指定像素大小。这不是布局管理的工作方式。

使组件在框架中居中的最简单方法是使用GridBagLayout

//getContentPane().setLayout(new BorderLayout()); // remove
...
//getContentPane().add(buttonPanel, BorderLayout.CENTER); // remove
setLayout( new GridBagLayout() );
add(buttonPanel, new GridBagConstraints());

现在,每个按钮将被设置为其首选大小,面板的大小将包含所有按钮。

如果您想为按钮留出更多空间,则可以使用如下属性:

button[x].setMargins( new Insets(20, 20, 20, 20) );

阅读有关Layout Mangers的Swing教程,以获取有关每个布局管理器和工作示例的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.