簡體   English   中英

為什么進度條沒有進度?

[英]Why doesn't the progress bar progress?

調用以下函數來移動進度條,但我不知道為什么直到其他進程都正常工作后它才會移動。

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

        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
        }

可能是什么問題呢 ?

您的代碼似乎根本無法調整進度條:

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

這只會連續將條形圖的位置設置為5 ,這似乎是您的比例的50%左右。 也許如果不確定任務的長度,應該使進度條不確定嗎?

您還應該使用EDT通過setValue()調整進度條。 有關更多詳細信息,請參見Swing中並發教程

所有這些東西:

    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用於后台線程,並只需設置其值即可通過PropertyChangeListener輕松地跟隨JProgressBar。

while(!loginCompleted) {
            signInProgressBar.setValue(5);
            //System.out.println(p);
            p++;
            try {Thread.sleep(5000);}catch(Exception exc) {}
        } 

您犯了一個小錯誤signInProgressBar.setValue(5); 應該是ignInProgressBar.setValue(p);

當前代碼在啟動時會生成一個空條,然后立即將其設置為50%,沒有語句在登錄完成后繼續執行。

您可能需要repaint並使它們invalidate

嘗試

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

以及為什么將signInProgressBar.setValue始終設置為signInProgressBar.setValue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM