用于输出棋盘的按钮的网格布局

问题描述 投票:4回答:3

我正在用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异常。

java swing jbutton grid-layout
3个回答
4
投票

这是因为您仅将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);

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

0
投票

我这样做了,但是根据硬件的要求,它还有更多。但是我被告知要添加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();

}

}

© www.soinside.com 2019 - 2024. All rights reserved.