1

我不确定我的程序有什么问题。我认为这可能是线程的问题,即使我没有创建线程。我所拥有的是三个不同的类来实现扫雷游戏。一个是用于 81 (9 x 9) 个按钮的扩展 JButton 类 MineButton。第二个是包含 MineButtons 的扩展容器类 MineField。然后我有包含 MineField 对象的扫雷类。我有很多工作。现在我要做的是让 Minewseeper 类从 MineButton 类访问静态信息。在这里,我不知道该怎么做。在(我相信)字段和按钮被初始化并准备好显示之后。我将扫雷对象发送到一个无限循环中,以不断更新来自 MineButton 类的信息。当我这样做时,Applet 会弹出但不显示其内容。并且 showStatus 显示为零。这应该是什么。谢谢你的帮助。

这是扫雷类

    public class Minesweeper extends JApplet
    {
        MineField field;
        public void init()
        {
            field = new MineField(9,9);
            getContentPane().add(field);
            setSize(field.getSize());
        }

        public void start()
        {  
            // trying to fix my problem.  Wondering if not ready for display
            field.setNumbers();
            while(!field.initialized());


            while(true)
            {
                showStatus(MineButton.flagCount + "");
            }
        }
    }
4

1 回答 1

3

您至少可以在刷新状态之间添加一些延迟。现在你正在占用整个 CPU 的方式,除了忙于等待是一种非常糟糕的做法之外,swing 线程无法跳入并绘制你的东西。

while(true) {
    showStatus(MineButton.flagCount + "");

     try {
        Thread.sleep(1000);
    } catch (InterruptedException ex) {
        Logger.getLogger(Str.class.getName()).log(Level.SEVERE, null, ex);
    }
}

更好的解决方案是设置一个计时器,而不是while循环:

int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        showStatus(MineButton.flagCount + "");   // need to make sure that you can call showStatus
    }
};

new javax.swing.Timer(delay, taskPerformer).start();
于 2012-09-08T18:36:37.493 回答