GridLayout кнопок для вывода шахматной доски - PullRequest
4 голосов
/ 28 февраля 2012

Я программирую на Java и все еще довольно нов.Экспериментируя с Основами GUI, я решил создать шахматную доску со всеми 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 голосов
/ 28 февраля 2012

Это потому, что вы используете только один экземпляр объекта 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 голосов
/ 28 февраля 2012

Проблема в том, что черный и белый являются объектами 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;
}
...