2017-02-13 175 views
0

我已经增加了一个JRadioButtonJPanel和处理其鼠标单击事件如下Java代码处理并发事件的Java Swing事件处理

JRadioButton offline = new JRadioButton(); 
    offline.setText("Offline Mode"); 

    modePanel.add(offline); 

    modePanel.setLayout(new GridLayout(2,1)); 
    offline.addMouseListener(new java.awt.event.MouseAdapter() { 
       public void mouseClicked(java.awt.event.MouseEvent evt) { 
        offlineClicked(evt); 
       } 
      }); 

功能offlineClicked需要大约四周1分钟是完全执行。 并且直到它的执行完成,没有其他操作执行被处理。

此后执行的所有操作似乎进入事件队列并在offlineClicked完成执行时处理FIFO。

由于此,UI 似乎已进入挂起状态。

可以做什么来使摆动控制器事件同时发生,而不是等到最后才完全执行。

+3

标准技术是永远不要在事件线程上做应用程序工作。 始终在单独的处理线程上运行应用程序工作,以便UI保持响应。有关此主题的完整书籍和教程,请执行一些Google搜索。从Oracle的教程开始。 –

+2

您正在寻找按钮上的'SwingWorker'和'ActionListener'; [例如('SwingWorker')](http://stackoverflow.com/questions/20944719/how-to-use-swingworker/20945255#20945255) – MadProgrammer

+0

每次点击处理都很重要吗?或者你想要点击被忽略,直到完成第一次点击的初始过程? - 在实现并发解决方案时(即使使用SwingWorker等),您必须考虑到这一点。 – Fildor

回答

0

当mouselistener事件被触发时,它将在事件调度线程(重绘屏幕的swing gui thead)上运行。如果你把逻辑代码放在gui线程中,那么你的gui会冻结,直到逻辑完成并将gui线程返回到swing。你可以使用swingworker,或者另一个选项是简单地启动一个新线程,让gui线程返回,这样可以让其他的gui事件处理。在新线程中执行耗时的逻辑,它将从事件循环运行,因此摆动不会像运行异步一样冻结。你必须在调度线程上运行所有的swing代码,所以当逻辑完成后,因为你不再在调度线程上,你必须将它添加到事件队列中。

java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     // you can now safely use swing components 
     new frame.setVisible(true); 
    } 
});