0

所以,我正在制作一个棋盘,每当我尝试按下按钮时,它们都会不断重新定向,并且在右下角变得越来越乱。右上角的第一个按钮 (squareB[0][0]) 看起来不错,但所有其他 JButton 都搞砸了。

所以我的问题是如何解决这个问题或允许我将按钮放置在特定坐标处?

import java.awt.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.io.*;

public class Test implements ActionListener
{
private JFrame frame = new JFrame();
private JPanel[][] square = new JPanel[8][8];
private JButton[][] button = new JButton[8][8];
public static void main(String[] args)
{
    new Test();
}
Test() 
{
    frame.setLayout(new GridLayout(8,8));
    for(int x=0; x<8; x++)
    {
        for(int y=0; y<8; y++)
        {
            square[x][y] = new JPanel();
            frame.add(square[x][y]);
            square[x][y].setSize(100,100);
            square[x][y].setLayout(new GridLayout(1,1));
            if(y%2==0)
                if(x%2==0)
                    square[x][y].setBackground(Color.white);
                else
                    square[x][y].setBackground(Color.black);
            if(y%2!=0)
                if(x%2==0)
                    square[x][y].setBackground(Color.black);
                else
                    square[x][y].setBackground(Color.white);

            button[x][y] = new JButton();
            button[x][y] = new TestMethods(x,y);
            square[x][y].add(button[x][y]);
            button[x][y].setOpaque(false);
            button[x][y].setContentAreaFilled(true);  
            button[x][y].setBorderPainted(true);
            button[x][y].addActionListener(this);
        }
    }
    frame.setSize(800,800);
    frame.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{

}
}
class TestMethods extends JButton
{
private int x, y;
public TestMethods(int x, int y)
{
    this.x = x;
    this.y = y;
}
public int getX() {return x;}

public int getY() {return y;}
}
4

3 回答 3

1

我认为您的部分问题与您班级的getXandgetY方法有关。TestMethods这些是用于JButton确定其在其父级上的位置的覆盖方法,您应该避免覆盖它们

class TestMethods extends JButton
{
    private int x, y;
    public TestMethods(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public int getX() {return x;}

    public int getY() {return y;}
}

相反,我会使用与您的目的更相关的方法名称。

class TestMethods extends JButton
{
    private int gridX, gridY;
    public TestMethods(int x, int y)
    {
        this.gridX = x;
        this.gridY = y;
    }
    public int getGridX() {return gridX ;}

    public int getGridY() {return gridY ;}
}
于 2013-04-26T23:33:12.733 回答
0

请看MadProgrammer给出的答案。我还修改了您的示例以创建棋盘。请查看创建棋盘图案的修改方法。

Test() 
{
  frame.setLayout(new GridLayout(8,8));
  for(int x=0; x<8; x++)
  {
    for(int y=0; y<8; y++)
    {
        square[x][y] = new JPanel();
        frame.add(square[x][y]);
        square[x][y].setSize(100,100);
        square[x][y].setLayout(new GridLayout(1,1));



        button[x][y] = new TestMethods(x,y);
        button[x][y].setOpaque(true);
        button[x][y].setContentAreaFilled(true);  
        button[x][y].setBorderPainted(true);
        button[x][y].addActionListener(this);

        if((y + x)%2==0)
        {
            button[x][y].setBackground(Color.WHITE);
        }
        else
        {
            button[x][y].setBackground(Color.BLACK);
        }

        square[x][y].add(button[x][y]);
    }
  }
  frame.setSize(800,800);
  frame.setVisible(true);
}
于 2013-04-26T23:57:12.720 回答
0

好吧,我找不到你的代码出了什么问题,所以我确实写了一个方法来做同样的事情。我知道这不是答案,但可能有用:

public static void main(String[] args) {
    final JFrame frame = new JFrame();
    frame.setPreferredSize(new Dimension(800, 800));
    frame.setLayout(new GridLayout(8, 8));

    boolean isWhite = true;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            final JButton button = new JButton();
            if (isWhite) {
                button.setBackground(Color.white);
            } else {
                button.setBackground(Color.black);
            }
            isWhite = !isWhite;
            frame.add(button);
        }
        isWhite = !isWhite;
    }
    frame.pack();
    frame.setVisible(true);
}
于 2013-04-26T23:37:29.750 回答