-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