1

调用以下函数来移动进度条,但我不知道为什么它不会移动,直到其他进程正常运行。

private void startProgressBar() {
    signInProgressBar.setMinimum(0);
    signInProgressBar.setMaximum(10);
    Runnable r = new Runnable() {
        @Override
        public void run() {
            int p = 1;
            while(!loginCompleted) {
                signInProgressBar.setValue(p);
                //System.out.println(p);
                p++;
                try {Thread.sleep(5000);}catch(Exception exc) {}
            }                    
        }
    };
    new Thread(r,"progress_bar_thread").start();
}

调用的代码段startProgressBar

        startProgressBar(); // CALL
        String username = usernameTextField.getText();
        String password = new String(passwordField.getPassword());
        Openfire server = new Openfire();
        boolean isConnected = server.connect(username,password);
        if(isConnected) {
            // Stash the username and password
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);

            // Stop the progress bar
            loginCompleted = true;

            // Display the next window
            UserGUI blab = new UserGUI();
            blab.setVisible(true);
            this.dispose(); // Dispose off the login window
        }

可能是什么问题呢 ?

4

4 回答 4

2

您的代码似乎根本没有调整进度条:

signInProgressBar.setValue(5);  // <-- in your while loop

这只是不断地将条形图的位置设置为5,这在您的比例上似乎约为 50%。也许如果你不确定你的任务的长度,你应该让你的进度条不确定

您还应该使用 EDT 来调整进度条setValue()。有关更多详细信息,请参阅Swing 中的并发教程

于 2013-10-30T16:25:20.267 回答
1

所有这些东西:

    Openfire server = new Openfire();
    boolean isConnected = server.connect(username,password);
    if(isConnected) {
        // Stash the username and password
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        // Stop the progress bar
        loginCompleted = true;
        // ....

... 应该在后台线程上完成,尤其是与服务器连接和交互,否则您将占用 Swing 事件线程和整个 GUI。还为您的后台线程使用 SwingWorker,只需设置 JProgressBar 可以通过 PropertyChangeListener 轻松跟踪的值。

于 2013-10-30T16:46:22.417 回答
0
while(!loginCompleted) {
            signInProgressBar.setValue(5);
            //System.out.println(p);
            p++;
            try {Thread.sleep(5000);}catch(Exception exc) {}
        } 

你犯了一个小错误 signInProgressBar.setValue(5); 应该是 ignInProgressBar.setValue(p);

当前代码在开始时会生成一个空栏,然后立即将其设置为 50% ,登录完成后没有任何语句可以继续。

于 2013-10-30T16:27:55.720 回答
-2

您可能需要repaintinvalidate.

尝试

signInProgressBar.invalidate();
signInProgressBar.repaint();

以及为什么你总是设置 5 为signInProgressBar.setValue

于 2013-10-30T16:24:52.990 回答