2017-04-09 4 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

はあなたがバックグラウンドでにログインを実行し、いずれかのPropertyChangeListenerを使用するか、上書きすることが可能になるSwingWorkerのを、使用することを検討してくださいとにかくオブザーバーパターンのいくつかの種類を必要とするだろうメッセージを表示する完了メソッド – MadProgrammer

答えて

2

で、簡単かつ安全なの一つは、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; 
    } 

} 

ため Worker Threads and SwingWorkerを参照してくださいを利用することですそれは...

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方法だオーバーライドするが、その後、あなたは

関連する問題