Java定时器与GUI同步

标签 java multithreading swing timer nullpointerexception

我正在尝试对组件进行增量显示,因为进行所有计算需要太多时间。所以我不想卡住图形界面,我想每 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)

感谢您的帮助

最佳答案

您每秒都在创建一个 Action 监听器,这没有任何意义。你显然不明白怎么event listeners工作或如何Timer类(class)作品。

此外,EDT 上的任务(事件调度线程)必须快速完成;如果不这样做,未处理的事件会备份并且用户界面变得无响应

您需要使用Swing Worker为了正确归档concurrency .

来自 Oracle 网站:

Swing consists of three kinds of threads:

  • Initial threads, the threads that execute initial application code.

  • The event dispatch thread, where all event-handling code is executed. Most code that interacts with the Swing framework must also execute on this thread.

  • Worker threads, also known as background threads, where time-consuming background tasks are executed.

关于Java定时器与GUI同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16751625/

相关文章:

java - 使用 Spring Data 过滤谓词计数

multithreading - 为什么信号/槽不适用于多线程?

java - 如何使用 Listener 将字符串传递给另一个类

java - JTable 关注整行而不是单元格

java - c3p0 和 Heroku postgres,SSL 问题

java - NSDate 日期字符串转换为 java.util.date

WPF 相当于 Windows 窗体中的 'Control.CheckForIllegalCrossThreadCalls'

android - 为什么这个协程会阻塞 UI 线程?

java - 在Java中读取CSV文件不起作用?

java - 使用 hibernate 和 Netbeans 获取数据