Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SwingWorker在后台执行复杂任务_Java_Swingworker - Fatal编程技术网

Java 使用SwingWorker在后台执行复杂任务

Java 使用SwingWorker在后台执行复杂任务,java,swingworker,Java,Swingworker,我有一个登录屏幕的GUI。每当我按下登录按钮时,就会根据在线mysql数据库中的条目检查用户名和密码,我在actionPerformed()中从数据库中提取所有这些信息登录按钮的方法。问题是当程序从数据库获取数据时GUI冻结。我在谷歌上搜索了我的问题,发现我应该使用SwingWorker,但作为一个新手,我不知道如何使用SwingWorker来实现我的目的。这个简单的扩展SwingWorker来获取带有Void的图标结果。类似地,您可能会扩展SwingWorker以获取一个。首先,在类中声明一个

我有一个登录屏幕的GUI。每当我按下登录按钮时,就会根据在线mysql数据库中的条目检查用户名和密码,我在actionPerformed()中从数据库中提取所有这些信息登录按钮的方法。问题是当程序从数据库获取数据时GUI冻结。我在谷歌上搜索了我的问题,发现我应该使用SwingWorker,但作为一个新手,我不知道如何使用SwingWorker来实现我的目的。

这个简单的
扩展SwingWorker
来获取带有
Void
图标结果。类似地,您可能会扩展
SwingWorker
以获取一个。

首先,在类中声明一个
SwingWorker
类型的成员变量(它可能在GUI类中),如下所示:

private SwingWorker<Boolean, Void> backgroundProcess;
    backgroundProcess = new SwingWorker<Boolean, Void>() {

        @Override
        protected Boolean doInBackground() throws Exception {
            // paste the MySQL code stuff here
        }

        @Override
        protected void done() {
            // Process ended, mark some ended flag here
            // or show result dialog, messageBox, etc      
        }
    };

如果操作正确,GUI不应在按钮按下事件后冻结

您的意思是我必须在doInBackground()方法中从DB获取数据,并在用户单击登录按钮时调用execute()方法。是
done()
在EDT上执行,因此您可以在获得连接后更新GUI,如何在done()方法中获取doInBackground()返回的值?如果JFrame为true,我想显示一个新的JFrame,如果返回false,我想显示一条错误消息。我是否需要另一个EDT in done来显示新的框架?@SushilKumar简单的方法是在
SwingWorker
声明中声明一个成员变量(在
new SwingWorker(){
行之后),您可以在doInBackground和done中引用该变量methods@h3nr1x是正确的;引用的示例包括一个
ImageIcon
成员变量。+1提供了一个有用的大纲,但我不理解使用
Boolean
连接
数据源
是否更合适。
    backgroundProcess.execute();