问题描述
我需要使用两个嵌套的 for 循环创建一个 8x8 网格,其中每个图块都是一个 JButton
。我试了又试,但无法完成。
黑白棋(黑白棋)作业需要。
解决方法
Oracle 有一个很棒的教程,Creating a GUI With JFC/Swing,它将带您完成创建 Swing GUI 的步骤。跳过 Netbeans 部分。
这是一个带有 JButtons
的 8 x 8 网格的 GUI。
我做的第一件事是调用 SwingUtilities
invokeLater
方法。此方法可确保在 Event Dispatch Thread 上创建和执行 Swing 组件。
我创建了一个 JFrame
。 JFrame
方法必须按特定顺序调用。这是我在大多数 Swing 应用程序中使用的顺序。
我创建了一个 JPanel
。 JPanel
使用 GridLayout
来布置我创建的 64 个 JButtons
。
Swing 组件应始终构建在 JPanel
中。 JFrame
有一个默认的 BorderLayout
,允许您在 JPanels
上放置最多九个 JFrame
。即使有可能,您也不应该将除 JPanels
或 JScrollPanes
以外的任何 Swing 组件直接放置在 JFrame
上。
这是完整的可运行代码。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class OthelloGUI implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new OthelloGUI());
}
@Override
public void run() {
JFrame frame = new JFrame("Othello GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createMainPanel(),BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createMainPanel() {
JPanel panel = new JPanel(new GridLayout(0,8));
panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));
for (int index = 0; index < 64; index++) {
JButton button = new JButton();
button.setPreferredSize(new Dimension(64,64));
panel.add(button);
}
return panel;
}
}