2017-10-08 92 views
-1

我用Java Swing應用程序,在那裏我有一個主框架和多個面板,我將其設定可見或不可見,並在同一時間,我在一個類實例化之間往返工作,其在後臺運行一個while循環。現在,問題是:除非while循環結束,否則面板不會出現,但是我希望讓用戶在while循環在後臺繼續時單擊某些按鈕,甚至連他都不知道。這裏是我的代碼一個小例子:如何實現線程併發性在Java中

 startPage.setVisible(false); 
     lblError.setVisible(false);  
     new QuestionPage(Integer.parseInt(fieldUserID.getText())); 

QuestionPage有一個while循環下去,我想,直到完成不凍結整個應用程序,而是讓,雖然在後臺循環運行。到目前爲止,我嘗試通過擴展Thread類來完成2個線程,但我不確定這是否是正確的方式。

[編輯]

這是我使用的SwingWorker以在後臺發送while循環這恰好在QuestionPage類和主框架上與擺動操作來進行後NEXT按鈕

btnStart.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) {     
      if (validateInput(fieldUserID.getText(), fieldAge.getText(), fieldSex.getSelectedItem().toString(), fieldExperience.getText())) { 
       startPage.setVisible(false); 
       lblError.setVisible(false); 
       SwingWorker worker = new SwingWorker<Void, String>() { 
        @Override 
        public Void doInBackground() { 
         new QuestionPage(Integer.parseInt(fieldUserID.getText())); 
         return null; 
         }       
        };        
      } else { 
       lblError.setVisible(true); 
      }    
     };     
    }); 
+1

Swing不是線程,你不應該從出方在事件調度線程的上下文更新的用戶界面。根據您的描述,您正在阻止EDT – MadProgrammer

+0

而不是使用循環,請嘗試使用計時器或擺動計時器來安排要執行的操作。 https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html –

+1

我建議你看看[併發在Swing(https://docs.oracle.com/javase/tutorial/ uiswing/concurrency /)以獲取更多詳細信息。我也建議你添加一個[最小,完整,可驗證的示例](https://stackoverflow.com/help/mcve),因爲現在,這一切都只是猜測工作 – MadProgrammer

回答

0

[ANSWER]

訣竅是使用SwingWorker在後臺發送長時間運行的任務,並且還要在其上調用​​。下面是一個Start按鈕事件偵聽器的最小工作示例:

// Send long running task in background 
       SwingWorker worker = new SwingWorker<Void, String>() { 
        @Override 
        public Void doInBackground() { 
         new QuestionPage(Integer.parseInt(fieldUserID.getText())); 
         return null; 
         }       
        }; 
        worker.execute();