-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);
}
};
});
Swing不是線程,你不應該從出方在事件調度線程的上下文更新的用戶界面。根據您的描述,您正在阻止EDT – MadProgrammer
而不是使用循環,請嘗試使用計時器或擺動計時器來安排要執行的操作。 https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html –
我建議你看看[併發在Swing(https://docs.oracle.com/javase/tutorial/ uiswing/concurrency /)以獲取更多詳細信息。我也建議你添加一個[最小,完整,可驗證的示例](https://stackoverflow.com/help/mcve),因爲現在,這一切都只是猜測工作 – MadProgrammer