Java 为什么赢了';颜色类不能在JButton上工作吗?

Java 为什么赢了';颜色类不能在JButton上工作吗?,java,swing,user-interface,jpanel,jbutton,Java,Swing,User Interface,Jpanel,Jbutton,我正在尝试创建一个棋盘,但由于某些原因它不起作用 final int HEIGHT = 600; final int WIDTH = 800; final int ROW = 8; final int COL = 8; String COLS = "ABCDEFGH"; JFrame frame = new JFrame(); JPanel chessBoard = new JPanel(); JButton[][] chessSquares = new JButton[R

我正在尝试创建一个棋盘,但由于某些原因它不起作用

final int HEIGHT = 600;
final int WIDTH = 800;
final int ROW = 8;
final int COL = 8;

String COLS = "ABCDEFGH";
JFrame frame = new JFrame();
JPanel chessBoard = new JPanel();
JButton[][] chessSquares = new JButton[ROW+1][COL+1];

public void initializeGUI() {
    
    
    frame.setSize(WIDTH, HEIGHT);
    frame.setTitle("Chess");
    chessBoard.setLayout(new GridLayout(ROW, COL));
    
    //Creating the chessboard without the pieces
    JButton temp;
    for(int row=1; row<=8; row++) {
        for(int col=1; col<=8; col++) {
            chessSquares[row][col] = new JButton("row: " + row + "col : " + col);
            if ((row+col) % 2 !=  0) {
                temp = chessSquares[row][col];
                temp.setBackground(Color.black);
                chessBoard.add(temp);
            }
            else {
            temp = chessSquares[row][col];
            temp.setBackground(Color.white);
            chessBoard.add(temp);
            }
        }
    }
    
    
    frame.add(chessBoard);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    
}
final int HEIGHT=600;
最终整数宽度=800;
最终整数行=8;
最终整数=8;
字符串COLS=“ABCDEFGH”;
JFrame=新JFrame();
JPanel棋盘=新JPanel();
JButton[][]棋盘格=新JButton[ROW+1][COL+1];
public void initializeGUI(){
框架尺寸(宽度、高度);
帧。设置标题(“国际象棋”);
棋盘布局(新的网格布局(行、列));
//创建没有棋子的棋盘
按钮温度;
对于(int row=1;row
有些方块不是黑色的

我认为这是Mac LAF的问题

退房:

棋盘占据了GUI的全部空间

这就是BorderLayout的工作方式。任何添加到中心的组件都将占用框架中所有未使用的空间

如果你想固定棋盘的大小,那么你需要使用一个“包装器”面板

比如:

//frame.add(chessBoard);
JPanel wrapper = new JPanel();
wrapper.add( chessBoard );
frame.add(wrapper, BorderLayout.CENTER);
JPanel
的默认布局是
FlowLayout
,它将考虑添加到其中的任何组件的首选尺寸,因此现在按钮将以其首选尺寸显示

有些方块不是黑色的

我认为这是Mac LAF的问题

退房:

棋盘占据了GUI的全部空间

这就是BorderLayout的工作方式。任何添加到中心的组件都将占用框架中所有未使用的空间

如果你想固定棋盘的大小,那么你需要使用一个“包装器”面板

比如:

//frame.add(chessBoard);
JPanel wrapper = new JPanel();
wrapper.add( chessBoard );
frame.add(wrapper, BorderLayout.CENTER);

JPanel
的默认布局是
FlowLayout
,它将考虑添加到其中的任何组件的首选大小,因此现在按钮将以其首选大小显示。

发布的代码对我有效。在线运行它。如果它对您无效,您将必须提供更多信息。旁注:1。
new JB按钮[ROW+1][COL+1]
太大。请使用
new JButton[ROW][COL]
2。将循环从'for'更改为'(int行=1;row@c0der我需要将其保持在行+1和列+1,以便于处理事件。我正在制作一个行和列从1开始的棋盘。此外,我正在使用MAC。发布的代码适合我。在线运行。如果它不适合你,你必须提供更多信息。旁注:1。
new JButton[ROW+1][COL 1]
太大。请使用
new JButton[ROW][COL]
2。将循环从'for'更改为'for'(int行=1;row@c0der我需要将它保持在第+1行和第+1列,以便于处理事件。我正在制作一个行和列从1开始的棋盘。此外,我正在使用MAC电脑。@RandomKingRD在这个答案中添加了一个我不久前创建的国际象棋游戏示例,您可能会看到我使用了
JLabel
s与
JButton
s相反,因为它更有意义,您不需要单击一个块,您更愿意单击一个棋子,它将被放置到单击的块上,这样
JButton
就可以了overkill@RandomKingRD除了这个答案之外,还有一个我在不久前创建的国际象棋游戏的例子,任何OP可能会发现有用的东西我看不出我使用了
JLabel
s而不是
JButton
s,因为它更有意义,你不需要点击一个块,你宁愿点击一个棋子,它将被放置在点击的块上,所以
JButton
是多余的