处理并发事件Java Swing事件处理程序

时间:2017-02-13 07:41:23

标签: java swing concurrency event-handling jpanel

我有以下Java代码,它将JRadioButton添加到JPanel并处理其鼠标点击事件

    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分 才能完全执行。 并且在执行完成之前,不会处理执行的其他操作。

此后执行的所有操作似乎都转到Eventqueue并在offlineClicked完成执行时处理FIFO。

由于这个原因,UI 似乎已进入挂起状态。

可以做什么来同时处理swing处理事件而不是等到最后一次完全执行。

1 个答案:

答案 0 :(得分:0)

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

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