我想要的东西就像当用户点击登录按钮时,应该继续显示加载过程。在几秒钟之后,应该显示带有消息的消息框,并且应该隐藏加载过程。 但我的代码中的问题是加载过程和延迟后同时显示的消息。 这是我的代码
b.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String path="C:\\Users\\xxxxx\\yyyyyy\\Load.gif";
loading.setIcon(new ImageIcon(path));
loading.setBounds(400, 200, 350, 300);
if(user_name.equals(str) && pass.equalsIgnoreCase(str)){
try {
JOptionPane.showMessageDialog(null,"Login Success");
loading.setVisible(false);
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
答案 0 :(得分:2)
您可以通过多种方式执行此操作,其中一种更简单,更安全的方法是使用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
,因为它会分离流程,但您可以扩展LoginWorker
并覆盖它{{1}相反,但是你需要某种观察者模式