Java Swing:JPanel";“设置大小”;被忽略了吗?

Java Swing:JPanel";“设置大小”;被忽略了吗?,java,swing,jframe,jpanel,jbutton,Java,Swing,Jframe,Jpanel,Jbutton,因此,在我的程序中,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"); setDef

因此,在我的程序中,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();
}
我怎样才能解决这个问题

但是,buttonPanel会在整个JFrame中拉伸自己

buttonPanel.setSize(315, 315);
对。这是边界布局的规则。添加到中心的任何构件都将占用框架中的所有可用空间

GridLayout也将扩展到占用所有可用空间

我希望按钮面板只占中心315x315的空间

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

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

//getContentPane().setLayout(new BorderLayout()); // remove
...
//getContentPane().add(buttonPanel, BorderLayout.CENTER); // remove
setLayout( new GridBagLayout() );
add(buttonPanel, new GridBagConstraints());
现在,每个按钮将设置为其首选大小,面板的大小将包含所有按钮

如果要为按钮留出额外空间,请使用以下属性:

button[x].setMargin( new Insets(20, 20, 20, 20) );
有关每个布局管理器和工作示例的详细信息,请阅读上的Swing教程

编辑:

JFrame设置为特定大小且不可调整大小。有没有一种方法可以不考虑像素

忘了框架吧。这不是你使用秋千的方式。每个LAF上的组件大小可能不同。例如,使用的字体可以不同。标题栏或边框的大小可以不同。不要试图设置帧的大小。您为每个组件提供“提示”,并让每个组件确定其大小。然后您将
pack()
框架,框架将成为子组件的大小

例如,对于您可以执行的按钮:

button.setPreferredSize( new Dimension(50, 50) );
panel.setBorder( new EmptyBorder(200, 200, 200, 200) );
因此,如果网格中有4个按钮,面板的大小将为(200 x 200)

如果您需要面板上的额外空间,可以执行以下操作:

button.setPreferredSize( new Dimension(50, 50) );
panel.setBorder( new EmptyBorder(200, 200, 200, 200) );
这将为面板(包括按钮)的大小保留额外空间(400 x 400)

然后,当您
pack()
框架时,框架大小将是(600 x 600)加上标题栏和边框的大小

阅读教程!还有一节介绍如何使用边框

但是,buttonPanel会在整个JFrame中拉伸自己

buttonPanel.setSize(315, 315);
对。这是边界布局的规则。添加到中心的任何构件都将占用框架中的所有可用空间

GridLayout也将扩展到占用所有可用空间

我希望按钮面板只占中心315x315的空间

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

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

//getContentPane().setLayout(new BorderLayout()); // remove
...
//getContentPane().add(buttonPanel, BorderLayout.CENTER); // remove
setLayout( new GridBagLayout() );
add(buttonPanel, new GridBagConstraints());
现在,每个按钮将设置为其首选大小,面板的大小将包含所有按钮

如果要为按钮留出额外空间,请使用以下属性:

button[x].setMargin( new Insets(20, 20, 20, 20) );
有关每个布局管理器和工作示例的详细信息,请阅读上的Swing教程

编辑:

JFrame设置为特定大小且不可调整大小。有没有一种方法可以不考虑像素

忘了框架吧。这不是你使用秋千的方式。每个LAF上的组件大小可能不同。例如,使用的字体可以不同。标题栏或边框的大小可以不同。不要试图设置帧的大小。您为每个组件提供“提示”,并让每个组件确定其大小。然后您将
pack()
框架,框架将成为子组件的大小

例如,对于您可以执行的按钮:

button.setPreferredSize( new Dimension(50, 50) );
panel.setBorder( new EmptyBorder(200, 200, 200, 200) );
因此,如果网格中有4个按钮,面板的大小将为(200 x 200)

如果您需要面板上的额外空间,可以执行以下操作:

button.setPreferredSize( new Dimension(50, 50) );
panel.setBorder( new EmptyBorder(200, 200, 200, 200) );
这将为面板(包括按钮)的大小保留额外空间(400 x 400)

然后,当您
pack()
框架时,框架大小将是(600 x 600)加上标题栏和边框的大小


阅读教程!还有一节介绍如何使用边框

谢谢。但是,在我的特定应用程序中,JFrame被设置为特定的大小,并且不可调整大小。有没有一种方法可以不考虑像素?Dave这不是你设计应用程序的方式。请参阅编辑。明白了,谢谢。但是,在我的特定应用程序中,JFrame被设置为特定的大小,并且不可调整大小。有没有一种方法可以不考虑像素?Dave这不是你设计应用程序的方式。请参见编辑。