【问题标题】:How can I set size of a button?如何设置按钮的大小?
【发布时间】:2011-02-01 23:21:00
【问题描述】:

我将按钮放在带有 GridLayout 的 JPane 中。然后我用 BoxLayout.Y_AXIS 将 JPanel 放入另一个 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 试图填满窗口的所​​有高度。我怎样才能消除这种行为?

【问题讨论】:

    标签: java user-interface swing button size


    【解决方案1】:

    我就是这样做的。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我试过这段代码。有用。但是如果我尝试在我的程序中实现相同的想法,它就行不通。我认为原因是我将我的 JPanel(带有 GridLayout)包含到另一个 JPanel(带有 BoxLayout.Y_AXIS)中。
      • @Roman 如果您需要更具体的帮助,您需要发布一些示例代码!
      • 为什么不在所有按钮之间共享一个new Dimension(40, 40) 而不是实例化其中的 16 个?
      【解决方案3】:

      尝试使用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);
          }
      }
      

      【讨论】:

      • 编译器写道它找不到名为setPreferredSize的方法。
      【解决方案4】:

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

      一个更好的主意可能是为您的按钮使用 FlowLayout,或者如果您确切知道自己想要什么,也许是 GroupLayout。 (Sun/Oracle recommend 手工编码时 GroupLayout 或 GridBag 布局比 GridLayout 更好。)

      【讨论】:

        猜你喜欢
        • 2014-03-25
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 2022-08-06
        • 1970-01-01
        相关资源
        最近更新 更多