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