有一对夫妇,你可以这样做的方式,较简单和更安全的一个是使用SwingWorker
,看到Worker Threads and SwingWorker更多细节
public class LoginWorker extends SwingWorker<Boolean, Void> {
private String userName;
private char[] password;
public LoginWorker(String userName, char[] password) {
this.userName = userName;
this.password = password;
}
@Override
protected Boolean doInBackground() throws Exception {
// Here is where you do the actualy login process...
// You'll notice I passed the login/password to the constructor
Thread.sleep(1000);
return true;
}
}
和利用它...
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
btnLogin.setEnabled(false);
LoginWorker worker = new LoginWorker("username", new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'});
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
SwingWorker<Boolean, Void> worker = (SwingWorker<Boolean, Void>) evt.getSource();
if ("state".equals(evt.getPropertyName())) {
SwingWorker.StateValue state = (SwingWorker.StateValue) evt.getNewValue();
switch (state) {
case DONE: {
btnLogin.setEnabled(true);
try {
boolean result = worker.get();
if (result) {
JOptionPane.showMessageDialog(TestPane.this, "Login was successful");
} else {
JOptionPane.showMessageDialog(TestPane.this, "Login was unsuccessful");
}
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
}
break;
}
}
}
});
worker.execute();
}
});
我选择了利用PropertyChangeListener
在这种情况下,它分离的过程中,但你可以è xtend LoginWorker
并改写它的done
方法,但是然后您需要某种观察者模式
考虑使用SwingWorker,它允许您在后台执行登录并使用PropertyChangeListener或覆盖完成方法来显示消息 – MadProgrammer