3

グラフィカルなディスプレイを備えた単純な Knight's Tour プログラムを作成しています。コンソールで動作するように既に書きましたが、今はそのコードを移行して、swing で動作するようにしています。アクションリスナーがプロセスを開始して操作するボタンがあります。コードは次のとおりです。

askButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            int[][] tour = getBoard(); // generates a matrix representing a successful knight's tour
            int count = 0;

            while (count < 64) {
                count++;
                Location loc = searchFor(count, tour); //gets the location of the int "count" inside the matrix "tour"
                board.setVisible(false); //board contains a matrix of JPanels called "grid".
                grid[loc.row()][loc.column()].add(new JLabel("" + count)); //adds JLabel to JPanel with the proper number
                board.setVisible(true); //reset to visible to show changes
                delay(1000); //wait 1000 milliseconds - one second - to allow user to view changes
            }
        }
    });

それがコードです。各数値を1秒間隔で個別に表示したいのですが、このままではフレームがしばらく空白になり、終了すると突然すべての数値が表示された結果が表示されます。誰か助けてくれませんか?ありがとうございました。

4

4 に答える 4

5

ここにすべての答えをまとめてください

1. AWT / Swing Listenerからコードが実行されている間はsleep(int)、呼び出さないでください。wait(int)

また

2.after //add既に表示されているコンテナを呼び出す必要がありremoveますmodify

  • revalidate()そしてrepaint()、その後setVisible()

3.コードsetVisible内にラップする必要がありinvokeLaterますあなたの性質

于 2012-05-27T16:27:40.730 に答える
4

メソッドdelayはイベント ディスパッチ スレッドをブロックし、それらのコンポーネントの再描画を回避します。Swing とスレッドの詳細については、Swing Concurrency Tutorialを参照してください。

問題の可能な解決策は、メソッドの代わりにSwingを使用することですTimerdelay

于 2012-05-27T15:41:36.883 に答える
-1

そのwhileループにいるときは、repaint()決して呼び出されません。そのため、メソッドが終了するまで何も表示されません。

于 2012-05-27T15:44:07.307 に答える
-1

まず、GUI に変更を加えた後、 revalidate() と repaint() を呼び出してみてください。第二に、CSE の支援として、あなたのプロジェクトに似た GUI プロジェクトもありました。

プロセス中に、GUI が意図したとおりに同時に更新されないことがわかりました。私はそれを解決する多くの方法を試しました。最終的な解決策は、フレームとの通信を改善するために setIcon または setText を使用して、ボード (JFrame) に JLabels または JPanels を追加することをあきらめることです。まあ、これはあくまで個人的な経験です。あなたのプロジェクトに役立つことを願っています。

于 2012-05-27T15:49:51.013 に答える