在JPanels中格式化JButton

时间:2013-04-26 23:17:36

标签: java formatting chess

所以,我正在制作一个棋盘,每当我试图按下按钮时,它们就会重新定向,并在右下角变得越来越混乱。右上角的第一个按钮(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;}
}

3 个答案:

答案 0 :(得分:1)

我认为您的部分问题与getX课程的getYTestMethods方法有关。这些是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 ;}
}

答案 1 :(得分: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);
}

答案 2 :(得分: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);
}