-1

好的,所以我正在尝试将 64 个 JButtons 的数组添加到具有 8 x 8 网格布局(棋盘类型的东西)的 JFrame。这是相关的代码部分:

public class othello implements ActionListener{
int [][] board = new int[8][8];
JFrame window = new JFrame();
JButton[] buttons = new JButton[64];

public othello(){

window.setSize(400,400);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new GridLayout(8,8));
window.setVisible(true);
    for (int i=0;i<64;i++){
        buttons[i] = new JButton("");
        buttons[i].addActionListener(this);
        window.add(buttons[i]);
    }
    for (int i=0;i<8;i++){
        for (int j=0;j<8;j++){
            board[i][j]=2;
        }
    }
    board[3][3]=0;board[4][4]=0;
    board[3][4]=1;board[4][3]=1;
}

public void actionPerformed(ActionEvent e){
    for (int i=0;i<8;i++){
        for (int j=0;j<8;j++){
            if(e.getSource()==buttons[i]){
                buttons[i].setEnabled(false);
                board[i][j]=1;
                check();
            }
        }
    }
}

public static void main (String[] args){
    new othello();
}

}

这段代码的结果是实际上添加了看似随机数量的按钮。有时它会添加所有 64 个,更常见的是它可能会添加一半左右,它总是正确启动但在任意点停止(我通过让按钮标签计数来测试)。

我添加了一些 println 来查看循环本身是否真正完成,那里没有问题,它会循环 64 次,它只是在某个时候停止添加按钮。

我是 Java 的初学者,所以我确信这非常简单和愚蠢,但我目前不知道出了什么问题。任何人都可以帮忙吗?

编辑更多代码。

4

3 回答 3

1

你初始化数组了吗?喜欢

JButton[] buttons = new JButtons[x];

进行一些打印以检查循环停止的次数。

于 2012-05-01T19:43:22.677 回答
0

您应该添加到 ContentPane 而不是直接添加到JFrame.add()

与所有其他 JFC/Swing 顶级容器一样,JFrame 包含一个 JRootPane 作为其唯一的子项。根窗格提供的内容窗格通常应包含 JFrame 显示的所有非菜单组件。

您是否将布局管理器设置为默认值以外的其他内容?

默认内容窗格将设置一个 BorderLayout 管理器。有关添加、删除和设置 JFrame 的 LayoutManager 的详细信息,请参阅 RootPaneContainer。

添加内容的正确惯用代码如下:

window.getContentPane().add(child);

有关正确使用的详细信息,请参阅Javadoc

于 2012-05-01T19:52:00.743 回答
0

也许您没有使用事件调度线程来操作 UI?

来自Swing 教程

事件调度线程,所有事件处理代码都在其中执行。大多数与 Swing 框架交互的代码也必须在这个线程上执行。

尝试使用SwingUtilities.invokeAndWait().

编辑:更正的源代码将是:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class othello implements ActionListener
{
    int[][] board = new int[8][8];
    JFrame window = new JFrame();
    JButton[] buttons = new JButton[64];

    public othello()
    {
        try
        {
            SwingUtilities.invokeAndWait(new Runnable()
            {
                public void run()
                {
                    window.setSize(400, 400);
                    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    window.setLayout(new GridLayout(8, 8));
                    window.setVisible(true);
                    for (int i = 0; i < 64; i++)
                    {
                        buttons[i] = new JButton("");
                        buttons[i].addActionListener(othello.this);
                        window.getContentPane().add(buttons[i]);
                    }
                    for (int i = 0; i < 8; i++)
                    {
                        for (int j = 0; j < 8; j++)
                        {
                            board[i][j] = 2;
                        }
                    }
                    board[3][3] = 0;
                    board[4][4] = 0;
                    board[3][4] = 1;
                    board[4][3] = 1;
                }
            });
        }
        catch (Exception e)
        {
            // TODO Handle exception
            e.printStackTrace();
        }
    }

    public void actionPerformed(ActionEvent e)
    {
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                if (e.getSource() == buttons[i])
                {
                    buttons[i].setEnabled(false);
                    board[i][j] = 1;
                    // check();
                }
            }
        }
    }

    public static void main(String[] args)
    {
        new othello();
    }

}
于 2012-05-01T19:48:40.963 回答