用于输出棋盘的按钮的GridLayout

时间:2012-02-28 16:31:19

标签: java swing jbutton grid-layout

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 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();    
  } 
}