1

プログラムのどこが悪いのかわかりません。スレッドを作成していなくても、スレッドに問題があるのではないかと思います。私が持っているのは、ゲームマインスイーパを実装するための3つの異なるクラスです。1つは、81(9 x 9)ボタンに使用される拡張JButtonクラスMineButtonです。2つ目は、MineButtonを含む拡張ContainerクラスMineFieldです。次に、MineFieldオブジェクトを含むクラスMinesweeperがあります。私はそれがたくさん働いています。今私がやろうとしているのは、MinewseeperクラスにMineButtonクラスの静的情報にアクセスさせることです。ここでは、どうすればいいのかわかりません。(私が信じる)後、フィールドとボタンは初期化され、表示の準備が整います。Minesweeperオブジェクトを無限ループに送り、MineButtonクラスからの情報を絶えず更新します。これを行うと、アプレットがポップアップしますが、その内容は表示されません。そして、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 に答える