如何调整按钮大小并将它们移动到不同的位置?

How do I adjust the button sizes and move them to be in a different place?

我正在尝试让一些按钮变得更大,并且能够移动它们以使它们更接近我的教授希望它们成为的样子,但我不确定该怎么做。

我决定使用 GridBagLayout,但我的教授从未谈论过它,所以我不确定我是否遗漏了任何东西或它到底是如何工作的。

形象也是他想让我们得到的。就是这样。

import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GUI {
    public static JPanel buttonPanel;

    private static JFrame frame;

    public static void main(String[] args) {
        frame = new JFrame("Layout Question");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new GridBagLayout());
        frame.add(mainPanel);
        
        buttonPanel = new JPanel();
        mainPanel.add(buttonPanel);
        buttonPanel.add(new JButton("hi"));
        buttonPanel.add(new JButton("long name"));
        buttonPanel.add(new JButton("bye"));
        buttonPanel.add(new JButton("1"));
        buttonPanel.add(new JButton("2"));
        buttonPanel.add(new JButton("3"));
        buttonPanel.add(new JButton("4"));
        buttonPanel.add(new JButton("5"));
        buttonPanel.add(new JButton("6"));
        buttonPanel.add(new JButton("7"));
        buttonPanel.add(new JButton("Cancel"));
    }

}

您可以对代码进行一些改进:

  1. 不要使用 static 变量,并将您的程序放在 EDT 上,一个简单的方法是:

     public static void main(String[] args) {
         SwingUtilities.invokeLater(new LayoutManagersExample()::createAndShowGUI);
     }
    
  2. 不要在你的 JFrame 上调用 setSize(...),它会使你的 window 比你想象的要小,它正在计算框架装饰对于大小,请改为调用 frame.pack(),或覆盖 JPanelgetPreferredSize(),请参阅 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? 以获得更深入的解释。

  3. 在将所有组件添加到 JFrame 之前不要调用 frame.setVisible(true),否则你会得到与不可见组件相关的奇怪错误,该行应该成为您代码中的最后一个。

  4. 分而治之,你可以使用多个JPanels和不同的Layout Managers,你可以将它们组合起来,稍后再加入它们。

一种可能的方法(与您的老师希望的不完全一样,但足够接近)是:

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class LayoutManagersExample {
    private JFrame frame;
    
    private JPanel pane;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new LayoutManagersExample()::createAndShowGUI);
    }
    
    private void createAndShowGUI() {
        frame = new JFrame("Layout Question");
        
        pane = new JPanel();
        
        JPanel topPanel = getTopPanel();
        JPanel boxesPanel = getBoxesPanel();
        JPanel buttonsPanel = getButtonsPanel();
        
        pane.add(boxesPanel);
        pane.add(buttonsPanel);
        
        frame.add(pane);
        frame.add(topPanel, BorderLayout.NORTH);
        frame.add(new JButton("Cancel"), BorderLayout.SOUTH);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //frame.setSize(500, 500);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    private JPanel getButtonsPanel() {
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setLayout(new GridLayout(2, 2));
        
        buttonsPanel.add(new JButton("1"));
        buttonsPanel.add(new JButton("2"));
        buttonsPanel.add(getInnerButtonsPanel());
        buttonsPanel.add(new JButton("7"));
        
        return buttonsPanel;
    }
    
    private JPanel getInnerButtonsPanel() {
        JPanel innerButtonsPanel = new JPanel();
        innerButtonsPanel.setLayout(new GridLayout(2, 2));
        
        innerButtonsPanel.add(new JButton("3"));
        innerButtonsPanel.add(new JButton("4"));
        innerButtonsPanel.add(new JButton("5"));
        innerButtonsPanel.add(new JButton("6"));
        
        return innerButtonsPanel;
    }
    
    private JPanel getBoxesPanel() {
        JPanel boxesPanel = new JPanel();
        boxesPanel.setLayout(new BoxLayout(boxesPanel, BoxLayout.PAGE_AXIS));
        
        boxesPanel.add(new JCheckBox("Bold"));
        boxesPanel.add(new JCheckBox("Italic"));
        boxesPanel.add(new JCheckBox("Underline"));
        boxesPanel.add(new JCheckBox("Strikeout"));
        
        return boxesPanel;
    }
    
    private JPanel getTopPanel() {
        JPanel topPanel = new JPanel();
        JPanel topButtonsPanel = new JPanel();
        
        topButtonsPanel.setLayout(new GridLayout());
        
        topButtonsPanel.add(new JButton("hi"));
        topButtonsPanel.add(new JButton("long name"));
        topButtonsPanel.add(new JButton("bye"));
        
        topPanel.add(new JLabel("Buttons: "));
        topPanel.add(topButtonsPanel);
        return topPanel;
    }
}

尝试代码,尝试通过组合布局找到不同的方法,在脑海中划分 window 的每一部分,看看如何对每个部分应用不同的布局管理器,像我一样将它们划分为方法以使事情更容易理解。

找到一种左对齐元素的方法,例如 JCheckBoxes 和其他东西