代码之家  ›  专栏  ›  技术社区  ›  Roman

如何设置按钮的大小?

  •  26
  • Roman  · 技术社区  · 15 年前

    我把按钮放在一个带有网格布局的jpane中。然后我将jpanel放入另一个带有boxlayout.y_axis的jpanel中。我希望网格布局中的按钮是方形的。我使用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试图使 firstPanel secondPanel 平等!此外,Java试图填充窗口的所有高度。如何消除这种行为?

    4 回复  |  直到 7 年前
        1
  •  31
  •   Alex Weitz Shailendra Singh    9 年前

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

    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);
    

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

        2
  •  5
  •   Jonas    15 年前

    尝试用 setPreferredSize 而不是 setSize .

    更新: GridLayout 占据容器中的所有空间,并且 BoxLayout 接缝将占据容器中的所有宽度,因此我添加了一些不可见的粘合面板,当用户拉伸窗口时只占用空间。我只是做了水平的,而不是垂直的,但是如果你想的话,你可以用同样的方式实现它。

    自从 网格布局 使所有单元格大小相同,它们是否具有指定的大小并不重要。你必须为它的容器指定一个大小,正如我所做的那样。

    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);
        }
    }
    
        3
  •  3
  •   Tanvir Rahman    7 年前

    我就是这样做的。

                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);
    
        4
  •  2
  •   John    15 年前

    GridLayout通常不是按钮的最佳选择,尽管它可能适合您的应用程序。一个好的参考是 tutorial on using Layout Managers . 如果你看看GridLayout的例子,你会发现按钮看起来有点傻——太大了。

    一个更好的主意可能是对按钮使用flowlayout,或者如果您确切知道您想要什么,那么可以使用grouplayout。太阳/甲骨文 recommend 在手工编码时,grouplayout或gridbag布局比gridlayout好。)