我有一个我开发的GUI,它有几个按钮和一个JTextArea用于输出。我在下面有一些代码执行一个函数并更新TextArea,但是在执行函数之前我希望TextArea用字符串" Processing...
"来更新,只是为了给用户某种想法,应用程序正在运行,因为该函数需要一段时间才能执行。
目前这段代码没有更新GUI元素,我理解为什么。 GUI没有机会在改变TextArea的两个命令之间重新绘制,因此处理......"字符串永远不会显示。如何在Main.featureAnalysisTop()函数执行之前更改代码以便GUI元素更新?
if(e.getActionCommand().equals("Extract Features"))
{
featuresTextArea.setText("Processing...");
int nFeatures = nFeatureSlider.getValue();
Main.featureAnalysisTop(nFeatures);
featuresTextArea.setText("");
ArrayList<String> featureList = Main.getFeatureList();
for(String str : featureList)
{
featuresTextArea.append(str + "\n");
}
使用以下代码在我的main方法中执行GUI。
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
gui = new GUI2();
gui.setLocationRelativeTo(null);
gui.frmNeuralNetwork.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
答案 0 :(得分:1)
在执行其他方法时在单独的线程上更新GUI
这是Swing Woker类的工作,它允许您创建一个在后台运行的单独线程,并允许您相应地更新GUI。
例如,我做了一个简单的例子来完成你想要做的事情。
首先我们创建GUI并在ActionListener
之后添加JButton
,在Swing Worker
的文本更新为{{1当你试图这样做并且在5秒后(模拟你的长时间运行的任务)它会更新为JTextArea
。
您可以尝试并相应地更改代码。
processing...
参考文献:
这是另一个使用I'm done!
的示例:update jlabel text after opening jdialog
希望有所帮助