如何使用 Swing 以编程方式制作这种网格?

How can I make this kind of grid programmatically with Swing?

我是 Java 的新手。我想创建一个可以与一些逻辑代码交互的游戏网格。

我能够使用 Netbean 的 GUI 构建器工具来制作它(仅部分显示,但相同的模式重复了 10 x 10)。但是我还不熟悉在代码中创建复杂的布局。

问题是,在我的游戏逻辑中将每个按钮连接到数组元素似乎需要大量重复性工作,因为似乎没有办法在GUI 生成器。

(每组按钮都有自己的数组。)

有人可以告诉我如何完全用代码创建相同类型的网格吗?我猜 GridBagLayout 是所需要的。 (不同类型的块之间的对齐很重要。)但是看代码示例,似乎涉及很多概念,一次看得有点多。如果能以正确的方向开始,我将不胜感激。

或者,如果有一种方法可以在 GUI 构建器工具中有效地执行此操作,我想听听。

你基本上有两个选择,你可以通过某种方式使用复合组件,例如,它似乎是一个重复的模式,所以你可以隔离一个单一的"tile",着重于布局需求单个图块,然后使用不同的布局管理器对图块进行物理布局或使用 GridBagLayout 之类的东西对所有图块进行布局。

你使用什么将取决于你想要实现什么以及你试图产生的功能

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridx = 0;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(4, 4, 4, 4);

            for (int row = 0; row < 9; row++) {
                gbc.gridy = row;
                for (int col = 0; col < 9; col++) {
                    gbc.gridx = col;
                    if (row % 2 == 0) {
                        if (col % 2 == 0) {
                            add(bigButton(), gbc);
                        } else {
                            add(verticalButton(), gbc);
                        }
                    } else if (col % 2 == 0) {
                        add(horizontalButton(), gbc);
                    }
                }
            }
        }

        protected JButton bigButton() {
            JButton btn = new JButton() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(100, 100);
                }
            };
            return btn;
        }

        protected JButton verticalButton() {
            JButton btn = new JButton() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(45, 100);
                }
            };
            return btn;
        }

        protected JButton horizontalButton() {
            JButton btn = new JButton() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(100, 45);
                }
            };
            return btn;
        }
    }

}

有关详细信息,请参阅 How to Use GridBagLayout