首页 文章

用于输出棋盘的按钮的GridLayout

提问于
浏览
4

我用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异常 .

2 回答

  • 4

    这是因为您只使用JButton的一个实例对象作为黑色按钮,并且只使用JButton的一个实例对象作为白色按钮,并且您将越来越多地添加相同的2个引用到JPanel p1 . 因此,这不起作用,您需要为电路板上的每个按钮创建一个对象 . 以下是你如何做这样的事情:

    enter image description here

    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);
    
  • 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;
    }
    

相关问题