我使用Java编程,而且还很新。尝试使用GUI Basics,我决定制作一个棋盘,其中所有64个单元格都是JButton实例,背景为填充。可悲的是,当我尝试编译代码时,只显示了两个按钮,并且它们都没有着色。我试图理解这个问题,但现在看来有点超出我的想法。
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异常。
答案 0 :(得分:4)
这是因为您只使用JButton的一个实例对象作为黑色按钮,并且只使用JButton的一个实例对象作为白色按钮,并且您正在越来越多地向JPanel p1添加相同的2个引用。因此,这不起作用,您需要为电路板上的每个按钮创建一个对象。以下是您可以做的事情:
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);
答案 1 :(得分:2)
问题是黑色和白色是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;
}
答案 2 :(得分:0)
我这样做了,但是根据硬件,它做得更多。这,但是我被告知要添加JPanel和Jbuttons:
编写一个显示棋盘格的程序,其中每个黑白单元格都是一个JButton,背景为黑色或白色,如下图所示。重要!在程序中包含功能以创建实现ActionListener的侦听器类。
以下是我到目前为止所拥有的,但是有人告诉我我需要添加JPanel和JButtons:
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JFrame;
public class CheckerBox2 extends JFrame
{
JFrame frame=new JFrame();
public CheckerBox2()
{
frame.setSize(500, 500);
frame.setTitle("Original Checker Box");
//MessageLabel=new JLabel("Press button to add colors.");
frame.setLayout(new GridLayout(8, 8));
for (int i=0; i<8; i++)
{
for (int j=0; j<8; j++)
{
switch ((i+j)%2)
{
case 0:
addButton("red");
break;
case 1:
addButton("black");
break;
default:
break;
}
}
}
}
// addButton() is used to customize what the ActionListener object
private void addButton(String color)
{
JButton button=new JButton();
switch (color)
{
case "red":
button.setBackground(Color.RED);
break;
case "black":
button.setBackground(Color.BLACK);
break;
default:
break;
}
button.setOpaque(true);
button.setBorderPainted(false);
Command listener=new Command(color);
button.addActionListener(listener);
frame.add(button);
}
//The Command object has its constructor read in that color and display it verbatim at the command line.
private class Command implements ActionListener
{
private String color;
public Command(String c)
{
color=c;
}
public void actionPerformed(ActionEvent event)
{
System.out.println("Pressed "+ color + " button.");
}
}
public void run()
{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args)
{
CheckerBox2 box=new CheckerBox2();
box.run();
}
}