如何设置按钮的大小?

我把我的按钮放在带有GridLayout的JPane中。 然后我将JPanel放入另一个带有BoxLayout.Y_AXIS的JPanel中。 我希望GridLayout中的按钮是方形的。 我使用tmp.setSize(30,30)并且它不起作用。 我也尝试使用new GridLayout(X, Y, 4, 4)但我无法弄清楚X和Y是什么。 那么,做这些事情的正确方法是什么?

添加:

我仍然无法解决问题。 这是我想要做的代码:

 import javax.swing.*; import java.awt.*; public class PanelModel { public static void main(String[] args) { JFrame frame = new JFrame("Colored Trails"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); JPanel firstPanel = new JPanel(); firstPanel.setLayout(new GridLayout(4, 4)); JButton btn; for (int i=1; i<=4; i++) { for (int j=1; j<=4; j++) { btn = new JButton(); btn.setPreferredSize(new Dimension(100, 100)); firstPanel.add(btn); } } JPanel secondPanel = new JPanel(); secondPanel.setLayout(new GridLayout(5, 13)); for (int i=1; i<=5; i++) { for (int j=1; j<=13; j++) { btn = new JButton(); btn.setPreferredSize(new Dimension(40, 40)); secondPanel.add(btn); } } mainPanel.add(firstPanel); mainPanel.add(secondPanel); frame.add(mainPanel); frame.setSize(400,600); frame.setVisible(true); } } 

问题是Java试图使firstPanelsecondPanel宽度相等! 而且,Java试图填充窗口的所有高度。 如何删除此行为?

以下代码可以满足您的要求。 只需确保分配足够的空间,以便按钮上的文本可见

 JFrame frame = new JFrame("test"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JPanel panel = new JPanel(new GridLayout(4,4,4,4)); for(int i=0 ; i<16 ; i++){ JButton btn = new JButton(String.valueOf(i)); btn.setPreferredSize(new Dimension(40, 40)); panel.add(btn); } frame.setContentPane(panel); frame.pack(); frame.setVisible(true); 

X和Y(GridLayout构造函数的两个第一个参数)指定网格中的行数和列数(分别)。 如果您希望该值无限制,您可以将其中一个保留为0。

编辑

我修改了提供的代码,我相信它现在符合所需要的:

 JFrame frame = new JFrame("Colored Trails"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); JPanel firstPanel = new JPanel(); firstPanel.setLayout(new GridLayout(4, 4)); firstPanel.setMaximumSize(new Dimension(400, 400)); JButton btn; for (int i=1; i<=4; i++) { for (int j=1; j<=4; j++) { btn = new JButton(); btn.setPreferredSize(new Dimension(100, 100)); firstPanel.add(btn); } } JPanel secondPanel = new JPanel(); secondPanel.setLayout(new GridLayout(5, 13)); secondPanel.setMaximumSize(new Dimension(520, 200)); for (int i=1; i<=5; i++) { for (int j=1; j<=13; j++) { btn = new JButton(); btn.setPreferredSize(new Dimension(40, 40)); secondPanel.add(btn); } } mainPanel.add(firstPanel); mainPanel.add(secondPanel); frame.setContentPane(mainPanel); frame.setSize(520,600); frame.setMinimumSize(new Dimension(520,600)); frame.setVisible(true); 

基本上我现在设置面板的首选尺寸和框架的最小尺寸。

尝试使用setPreferredSize而不是setSize

更新: GridLayout占用其容器中的所有空间, BoxLayout接缝占据其容器中的所有宽度,因此我添加了一些不可见的胶合板,只是在用户拉伸窗口时占用空间。 我只是水平地完成了这个,而不是垂直地完成,但如果你想要它,你可以用同样的方式实现它。

由于GridLayout使所有单元格的大小相同,因此它们是否具有指定的大小并不重要。 你必须像我一样为其容器指定一个大小。

 import javax.swing.*; import java.awt.*; public class PanelModel { public static void main(String[] args) { JFrame frame = new JFrame("Colored Trails"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); JPanel firstPanel = new JPanel(new GridLayout(4, 4)); firstPanel.setPreferredSize(new Dimension(4*100, 4*100)); for (int i=1; i<=4; i++) { for (int j=1; j<=4; j++) { firstPanel.add(new JButton()); } } JPanel firstGluePanel = new JPanel(new BorderLayout()); firstGluePanel.add(firstPanel, BorderLayout.WEST); firstGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); firstGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); JPanel secondPanel = new JPanel(new GridLayout(13, 5)); secondPanel.setPreferredSize(new Dimension(5*40, 13*40)); for (int i=1; i<=5; i++) { for (int j=1; j<=13; j++) { secondPanel.add(new JButton()); } } JPanel secondGluePanel = new JPanel(new BorderLayout()); secondGluePanel.add(secondPanel, BorderLayout.WEST); secondGluePanel.add(Box.createHorizontalGlue(), BorderLayout.CENTER); secondGluePanel.add(Box.createVerticalGlue(), BorderLayout.SOUTH); mainPanel.add(firstGluePanel); mainPanel.add(secondGluePanel); frame.getContentPane().add(mainPanel); //frame.setSize(400,600); frame.pack(); frame.setVisible(true); } } 

这就是我做到的。

  JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("SAP Multiple Entries"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(new GridLayout(10,10,10,10)); frame.setLayout(new FlowLayout()); frame.setSize(512, 512); JButton button = new JButton("Select File"); button.setPreferredSize(new Dimension(256, 256)); panel.add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { JFileChooser fileChooser = new JFileChooser(); int returnValue = fileChooser.showOpenDialog(null); if (returnValue == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); keep = selectedFile.getAbsolutePath(); // System.out.println(keep); //out.println(file.flag); if(file.flag==true) { JOptionPane.showMessageDialog(null, "It is done! \nLocation: " + file.path , "Success Message", JOptionPane.INFORMATION_MESSAGE); } else{ JOptionPane.showMessageDialog(null, "failure", "not okay", JOptionPane.INFORMATION_MESSAGE); } } } }); frame.add(button); frame.pack(); frame.setVisible(true); 

GridLayout通常不是按钮的最佳选择,尽管它可能适用于您的应用程序。 一个很好的参考是使用布局管理器的教程 。 如果你看看GridLayout的例子,你会看到按钮看起来有点傻 – 太大了。

更好的想法可能是为您的按钮使用FlowLayout,或者如果您确切地知道您想要什么,可能是GroupLayout。 (Sun / Oracle 建议在手动编码时,GroupLayout或GridBag布局优于GridLayout。)