【问题标题】:How to show multiple JPanels with GridLayout buttons inside如何在里面显示多个带有 GridLayout 按钮的 JPanel
【发布时间】:2017-04-08 04:15:56
【问题描述】:

我正在尝试创建一些超级基本的东西,但在感到非常沮丧之后,我认为是时候在这里提问了。

想要的结果:

现在这是我的代码:

图形界面类

    package bookingProject;

import java.awt.Color;
import javax.swing.JPanel;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;

public class GUI extends javax.swing.JFrame {

    JFrame frame = new JFrame();
    JPanel silverPanel = new JPanel();
    JPanel goldPanel = new JPanel();
    Button buttons[] = new Button[30];

    public static void main(String args[]) {
        new GUI();
    }

    public GUI() {
        setSize(500, 500);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel bronzePanel = new JPanel();
        bronzePanel.setLayout(new GridLayout(3, 10));
        bronzePanel.setBackground(Color.red);
        for (int i = 0; i < 30; i++) {
            buttons[i] = new Button();
            bronzePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            bronzePanel.add(buttons[i]);
        }
        add(bronzePanel);
        setVisible(true);

        silverPanel.setLayout(new GridLayout(3, 10));
        silverPanel.setBackground(Color.yellow);
        for (int i = 0; i < 30; i++) {
            buttons[i] = new Button();
            silverPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            silverPanel.add(buttons[i]);
        }
        add(silverPanel);
        setVisible(true);

        goldPanel.setLayout(new GridLayout(3, 10));
        goldPanel.setBackground(Color.green);
        for (int i = 0; i < 30; i++) {
            buttons[i] = new Button();
            goldPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            goldPanel.add(buttons[i]);
        }
        add(goldPanel);
        setVisible(true);
    }

}

还有一个我想使用的按钮类

按钮类

    package bookingProject;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Button extends JButton implements ActionListener{
    public Button (){
    this.addActionListener(this);
}

    public void actionPerformed(ActionEvent e){
        Object source = e.getSource();
        if (source instanceof GUI){
            ((GUI)source).setBackground(Color.YELLOW);
        }
}
}

这就是我得到的:

我对这些东西很陌生,所以请原谅我完全的无知/能力......但我想要的是 3 个从上到下(青铜/银色/金色)的面板,每个面板都有一个 GridLayout 按钮......但是我能得到的只是青铜面板粘在其他所有东西的前面。我想我应该使用 BoxLayout 将 3 个面板排序成一个顺序,但我玩了大约 4 个小时,感觉我的速度没有任何进展。

我还需要一种方法,在我按下按钮时让它们变黄,但目前这不起作用;虽然我几乎没有看那个。

【问题讨论】:

  • psst codevideo
  • 你觉得我的帖子有帮助吗?

标签: java swing user-interface


【解决方案1】:

这就是我得到的:

默认情况下,JFrame 的内容窗格使用BorderLayout。当您将组件添加到框架时,组件会默认添加到 BorderLayout.CENTER,因为您没有指定约束。 CENTER 中只能显示一个组件,因此只有最后一个添加的组件可见。

我想我应该使用 BoxLayout

这是一种方法(但可能不是最简单的方法),因为您需要手动指定每行组件之间的空间。

How to Use Box Layout 上的 Swing 教程部分有一个工作示例可帮助您入门。

最简单的方法是使用具有 3 行和 2 列的 GridLayout 作为框架的布局管理器。然后每个单独的面板也可以使用 3 行 5 列的GridLayout

如果您希望每个面板中的组件之间有空格,那么您需要查看GridLayout API。它允许您指定组件之间的垂直和水平间隙。

另一种方法是使用GridBagLayout,尽管这有点复杂,因为您需要为添加的每个组件指定约束。

本教程还包含有关 How to Use GridBag LayoutHow to Use GridLayout 的部分。

请注意,本教程中的示例还将向您展示如何更好地构建代码,以便在事件调度线程 (EDT) 上创建组件。

【讨论】:

    【解决方案2】:

    你可以试试GridBagLayout

    import javax.swing.JFrame;
    import javax.swing.JButton;
    import java.awt.GridBagLayout;
    import java.awt.GridBagConstraints;
    import javax.swing.SwingUtilities;
    import javax.swing.JPanel;
    import java.awt.Insets;
    import java.awt.Color;
    class Demo{
        public static void main(String[]args){
            SwingUtilities.invokeLater(()->{
                JFrame frame=new JFrame("Grid");
                JPanel panel=(JPanel)frame.getContentPane();
                GridBagConstraints gbc=new GridBagConstraints();
                gbc.insets=new Insets(9,7,5,5);
                panel.setLayout(new GridBagLayout());
    
                panel.add(newGrid(Color.YELLOW,gbc, 0, 0),gbc);
                panel.add(newGrid(Color.YELLOW,gbc, 1, 0),gbc);
    
                panel.add(newGrid(Color.LIGHT_GRAY,gbc, 0, 1),gbc);
                panel.add(newGrid(Color.LIGHT_GRAY,gbc, 1, 1),gbc);
    
                panel.add(newGrid(Color.GREEN,gbc, 0, 2),gbc);
                panel.add(newGrid(Color.GREEN,gbc, 1, 2),gbc);
    
                frame.pack();
                frame.setLocationByPlatform(true);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            });
        }
        private static JPanel newGrid(Color color, GridBagConstraints pGbc, int pX, int pY){
            JPanel panel=new JPanel(new GridBagLayout());
            GridBagConstraints gbc=new GridBagConstraints();
            gbc.insets=new Insets(5,5,5,5);
            for(int x=0;5>x;x++){
                for(int y=0;3>y;y++){
                    gbc.gridx=x;
                    gbc.gridy=y;
                    JButton btn=new JButton("<html>&nbsp;</html>");
                    btn.setBackground(color);
                    panel.add(btn,gbc);
                }
            }
            pGbc.gridx=pX;
            pGbc.gridy=pY;
            return panel;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多