我正在用Java编程,但还很新。通过使用GUI Basics,我决定制作一个棋盘格,将所有64个单元格作为JButtons的实例,并填充背景。可悲的是,当我尝试编译代码时,仅显示两个按钮,并且两个按钮都不显示颜色。我正在尝试了解问题,但现在看来似乎超出了我。
package checkerboard;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.*;
public class Checkerboard extends JFrame {
public Checkerboard() {
JButton black = new JButton("B");
JButton white = new JButton("W");
black.setBackground(Color.BLACK);
white.setBackground(Color.WHITE);
JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(8, 8));
p1.setSize(600, 600);
for (int i = 0; i < 8; i++) {
if (i % 2 == 0) {
for (int j = 0; j < 4; j++) {
p1.add(black);
p1.add(white);
}
} else {
for (int j = 0; j < 4; j++) {
p1.add(white);
p1.add(black);
}
}
}
super.add(p1);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Checkerboard frame = new Checkerboard();
frame.setTitle("Checkers");
frame.setSize(600, 600);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
[在尝试使用JPanel时,出于某些奇怪的原因,第27行出现了NullPointer异常。
这是因为您仅将JButton的一个实例对象用作黑色按钮,并且仅将JButton的一个实例对象用作白色按钮,并且越来越多地将相同的2个引用添加到JPanel p1。因此,这将无法正常工作,您需要为板上的每个按钮创建一个对象。这是您可以如何做的事情:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9ZdEp3NS5wbmcifQ==” alt =“在此处输入图像描述”>
JButton[] blackButtons = new JButton[4 * 8];
JButton[] whiteButtons = new JButton[4 * 8];
for(int i = 0; i < blackButtons.length; i++)
{
blackButtons[i] = new JButton("B");
blackButtons[i].setBackground(Color.BLACK);
}
for(int i = 0; i < whiteButtons.length; i++)
{
whiteButtons[i] = new JButton("W");
whiteButtons[i].setBackground(Color.WHITE);
}
然后您可以像这样添加它们:
for (int i = 0; i < 8; i++) {
if (i % 2 == 0) {
for (int j = 0; j < 4; j++) {
p1.add(blackButtons[4 * i + j]);
p1.add(whiteButtons[4 * i + j]);
}
} else {
for (int j = 0; j < 4; j++) {
p1.add(whiteButtons[4 * i + j]);
p1.add(blackButtons[4 * i + j]);
}
}
}
add(p1);
问题是黑色和白色是JButton对象,并且您不能多次向一个JPanel添加同一对象。
每次添加时,您需要创建一个新的JButton。您可以在循环中即时实例化它们。
for (int i = 0; i < 8; i++) {
if (i % 2 == 0) {
for (int j = 0; j < 4; j++) {
p1.add(newButton("B", Color.Black));
p1.add(newButton("W", Color.White));
}
} else {
for (int j = 0; j < 4; j++) {
p1.add(newButton("W", Color.White));
p1.add(newButton("B", Color.Black));
}
}
}
只需添加一种方法即可。
private newButton(String label, Color background) {
JButton button = new JButton(label);
button.setBackground(background);
return button;
}
我这样做了,但是根据硬件的要求,它还有更多。但是我被告知要添加JPanel和Jbuttons:
编写一个显示棋盘格的程序,其中每个黑白单元格都是一个带有黑色或白色背景的JButton,如下图所示。重要!在程序中包含功能以创建实现ActionListener的侦听器类。
下面是我到目前为止所拥有的,但是有人告诉我我需要添加JPanel和JButtons:
import java.awt。*;
导入java.awt.event。*;
import javax.swing.JButton;
import javax.swing.JFrame;
公共类CheckerBox2扩展JFrame
{
JFrame frame = new JFrame();
public CheckerBox2()
{
frame.setSize(500,500);
frame.setTitle(“原始检查框”);
// MessageLabel = new JLabel(“按下按钮以添加颜色。”);
frame.setLayout(new GridLayout(8,8));
for(int i = 0; i <8; i ++)
{
for(int j = 0; j <8; j ++)
{
开关((i + j)%2)
{
情况0:
addButton(“ red”);
break;
情况1:
addButton(“ black”);
break;
默认:
break;
}
}
}
}
// addButton()用于自定义ActionListener对象
private void addButton(字符串颜色)
{
JButton button =新的JButton();
开关(彩色)
{
案例“红色”:
button.setBackground(Color.RED);
break;
案例“黑色”:
button.setBackground(Color.BLACK);
break;
默认:
break;
}
button.setOpaque(true);
button.setBorderPainted(false);
Command listener = new Command(color);
button.addActionListener(listener);
frame.add(button);
}
// Command对象的构造函数以该颜色读取,并在命令行上逐字显示。
私有类Command实现ActionListener
{
私有字符串颜色;
公共命令(字符串c)
{
color = c;
}
public void actionPerformed(ActionEvent事件)
{
System.out.println(“已按下” +颜色+“按钮。”];
}
}
public void run()
{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String [] args)
{
[CheckerBox2 box =新的CheckerBox2();
box.run();
}
}