Java for循环未正确完成

时间:2012-05-01 19:37:16

标签: java loops for-loop

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

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的初学者,所以我确信这是非常简单和愚蠢的事情,但我目前不知道出了什么问题。有人可以帮忙吗?

编辑了更多代码。

3 个答案:

答案 0 :(得分:1)

您是否初始化了阵列?像

JButton[] buttons = new JButtons[x];

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

答案 1 :(得分:0)

也许你没有使用event dispatch thread来操纵用户界面?

来自Swing Tutorial

  

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

尝试使用SwingUtilities.invokeAndWait()运行您的UI构建代码。

编辑:更正后的源代码为:

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

}

答案 2 :(得分:0)

您应该直接向ContentPane添加JFrame.add()

  

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

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

  

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

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

window.getContentPane().add(child);

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