0

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

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,我仍然应该能够在应用程序执行其数据库事务时关闭它。哪个没有发生?

我期待这里有什么问题还是代码有问题。

4

1 回答 1

0

你所期待的是错误的。

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

要异步执行任何操作,您需要使用线程。以 SwingWorker 类为例。但是,我相信您的数据库操作愿意返回一些数据或在 UI 上执行某些操作(除非您只是从数据库中删除某些内容?)

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

于 2016-02-24T17:47:33.687 回答