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



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

    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 似乎已进入挂起状态。

可以做些什么来使摆动同时处理事件,而不是等到最后一个事件完全执行。

当鼠标侦听器事件被触发时,它会在事件调度线程(重绘屏幕的摆动 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);
    }
} );

最新更新