Java-如何在特定块中进行延迟/等待

时间:2017-04-09 08:44:18

标签: java swing

我想要的东西就像当用户点击登录按钮时,应该继续显示加载过程。在几秒钟之后,应该显示带有消息的消息框,并且应该隐藏加载过程。 但我的代码中的问题是加载过程和延迟后同时显示的消息。 这是我的代码

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();
                }

1 个答案:

答案 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}相反,但是你需要某种观察者模式