swing中的invokeLater方法

时间:2014-05-15 13:27:47

标签: java swing swingutilities

您好我已经实现了以下方式调用以后的方法但仍然在我点击下一个按钮后我无法从关闭按钮获得响应。请在我的代码中指出错误,或者请告诉我,我期待的行为是否错误。

public void actionPerformed(ActionEvent e) {
//Some log messgae  
    if (e.getSource() == btnNext) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){

/// some piece of code for some database transaction

            }
        });

    }

我期待在这里,如果我点击btnNExt仍然我应该能够在它进行数据库事务时关闭应用程序。哪个没发生?

我预计这里会出现问题,或者代码存在问题。

1 个答案:

答案 0 :(得分:0)

你所期待的是错误的。

SwingUtilities.invokeLater不会异步启动您的操作,它只是在返回按钮事件处理程序后启动(并且队列中没有其他EDT事件) - 所以基本上它会在您的应用程序忙于处理GUI时启动代码事件

要异步执行任何操作,您需要使用Thread。请参阅SwingWorker类作为示例。但是,我相信你的数据库操作是愿意返回一些数据或在UI上做一些事情(除非你只是从数据库中删除一些东西?)

这会引发另一组问题,因为您永远不会从另一个线程更新GUI上的任何内容。在那里,您可以从数据库线程调用SwingUtilities.invokeAndWait来更新GUI上的内容。