2017-04-09 86 views
0

我想要的东西就像用户点击登录按钮加载过程时应该显示的那样。几秒钟后将显示带有消息的消息框并且应该隐藏加载过程。 但我的代码中的问题是加载过程和消息在延迟后同时显示。 这里是我的代码Java-如何在特定块中延迟/等待

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

考虑使用SwingWorker,它允许您在后台执行登录并使用PropertyChangeListener或覆盖完成方法来显示消息 – MadProgrammer

回答

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在这种情况下,它分离的过程中,但你可以è xtend LoginWorker并改写它的done方法,但是然后您需要某种观察者模式