3

カスタム ペイントが実行される JPanel があります。これには最大 15 秒かかる場合があります。

ここに画像の説明を入力

問題は、JPanel の描画中にメニューをクリックすると、メニュー上で描画が行われ、オプションが表示されないことです。(画像の歪んだテキストを参照してください)

ここに画像の説明を入力

ペイントが完了した後にメニューをクリックすると、望ましくない動作はありませんが、マウス ポインターを別のメニューに移動すると、同じことが再び起こります。たとえば、ペイントが完了した後、[アプリケーション] をクリックすると副作用は発生しませんが、マウス ポインターを [ヘルプ] に移動すると、前述の動作が発生します。どうすればこれを回避できますか?

別のスレッドで paintComponent() メソッドの外側でペイントを実行しています。

public class RandomIFSPanel extends JPanel {

  RandomIFSPanelRenderer randomIFSPanelRenderer;

 @Override
    public void paintComponent(Graphics graphics) {
        try {
            randomIFSPanelRenderer.stop();
        } catch (Exception e) {
        }
randomIFSPanelRenderer = new RandomIFSPanelRenderer();
   randomIFSPanelRenderer.start();
}

    class RandomIFSPanelRenderer extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < numberOfPoints; i++) {
                Graphics g=getGraphics();
             g.setColor(Color.WHITE);
               g.drawLine........
            }
        }
    }

}
4

4 に答える 4

2

まず、によって何度も呼び出される可能性があるpaintComponent()ため、メソッドでスレッドを開始しないでください。前のスレッドが終了していないのに、新しいスレッドが開始されるということがおそらく起こります。paintComponent()repaint()

次に、メニューを通常どおりに描画する場合はsuper.paintComponent(g)、 の先頭に追加してみてくださいpaintComponent()

第三に、Graphics g = getGraphics();なぜ使用しないのgraphicsですか?Graphics オブジェクトは変化しているため、次の描画が同じ古い Graphics オブジェクトで行われていると想定することはできません。

于 2013-03-07T17:43:02.967 に答える
1
  • スレッドを使用しないとEDTがブロックされます。すべてのイベントが画面に表示されるわけではなく、場合によっては1番目だけが表示されます。最後に、代わりにスイングタイマーを使用します

  • paintComponent内にObject、FileIO、Threadなどを作成しないでください。また、try --catch--finallyブロック内で安全ではありません。

  • 前にオブジェクトを作成し、それを配列とpaintComponent内に配置して、完成したオブジェクトの配列内でループします

  • SSCCEを投稿し、短く、実行可能で、コンパイル可能で、ペイントについては、すべてのオブジェクトをローカル変数として保存する必要があります(実際には、2次フェージングとズームアウトに関する質問への回答)

于 2013-03-08T11:17:15.003 に答える
0

paintComponentメソッド内でスレッドを実行することはありません。ペイントメソッドの外にスレッドがあります。

于 2013-03-07T17:25:33.937 に答える