0

すべての計算を行うには時間がかかりすぎるため、コンポーネントの増分表示を実行しようとしています。グラフィック インターフェイスをフリーズしたくないので、2.3 秒ごとに画像 (フラクタル) を表示したいと思います。すべてのポイントを計算する関数は compute です。インクリメンタル表示を作成する前に、このメソッドはすべてのポイントを計算していました。今では10000ポイントしか計算されません。

クラスFlameBuilderPreviewComponent:

Timer timer1=new Timer(1000,new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            time=time+10000;
            fa= builder.build().compute(density,frame,getWidth(),getHeight(),accumulator);

        }

    });
    timer1.start();
    for (int z = 0; z <fa.height(); z++) {
        for (int j = 0; j < fa.width(); j++) {
            image.setRGB(j,z,fa.color(palette, background, j, fa.height()-1-z).asPackedRGB());
        }
    }
    g0.drawImage(image,0,0,null);
    if (time>density*getWidth()*getHeight()){
        timer1.stop();
    }

次に、プログラムの他の部分はGUIインターフェイスです。別のタイマーを置きます。これは、画像の再描画を担当します。

クラスFlameMakerGUI:

    fBPC=new FlameBuilderPreviewComponent(builder, background, palette, r1, density);
    Timer timer = new Timer(2500,new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            fBPC.repaint();
            System.out.println("titi");
        }       
    });
    timer.start();
    fractale.add(fBPC,BorderLayout.CENTER);

次に、タイマーが実行されるたびにプログラムが表示するエラーは次のとおりです。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ch.epfl.flamemaker.gui.FlameBuilderPreviewComponent.paintComponent(FlameBuilderPreviewComponent.java:82)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1512)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1443)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1236)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:796)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:784)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706)
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:62)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1651)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.awt.EventQueue$3.run(EventQueue.java:686)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:697)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

助けてくれてありがとう

4

1 に答える 1

1

毎秒アクションリスナーを作成していますが、それは意味がありません。イベントリスナーがどのように機能するか、またはTimerクラスがどのように機能するかを理解していないことは明らかです。

また、(イベント ディスパッチ スレッド)上のタスクは迅速に終了する必要があります。そうしないと、未処理のイベントがバックアップされ、ユーザー インターフェイスが応答しなくなります。EDT

適切な並行性をアーカイブするには、 Swing Workerを使用する必要があります。

オラクルのウェブサイトから:

Swing は、次の 3 種類のスレッドで構成されます。

  • 初期スレッド、初期アプリケーション コードを実行するスレッド。

  • すべてのイベント処理コードが実行されるイベント ディスパッチ スレッド。Swing フレームワークとやり取りするほとんどのコードも、このスレッドで実行する必要があります。

  • バックグラウンド スレッドとも呼ばれるワーカー スレッド。時間のかかるバックグラウンド タスクが実行されます。

于 2013-05-25T16:35:01.960 に答える