我已经开发了一个GUI,它有几个按钮和一个用于输出的JTextArea。下面有一些执行函数并更新TextArea的代码,但是在执行该函数之前,我希望使用字符串"Processing...
“更新TextArea,这只是为了让用户知道应用程序正在工作,因为执行该函数需要一段时间。
目前,这些代码没有更新GUI元素,我理解其中的原因。GUI没有机会在更改TextArea的两个命令之间重新绘制,因此“处理.”字符串永远不会显示。如何更改代码,使GUI元素在执行Main.featureAnalysisTop()函数之前进行更新?
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");
}
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();
}
}
});
}
发布于 2017-12-19 08:51:27
在执行其他方法时,在单独线程上更新GUI
这是秋千炒锅类的一项任务,它允许您创建一个单独的线程,该线程在后台运行,并允许您相应地更新GUI。
例如,我做了一个简单的例子,完成了你想要做的事情。
首先,我们创建GUI并向我们的ActionListener
添加一个JButton
,它在将JTextArea
的文本更新为processing...
之后启动Swing Worker
,然后在5秒后(这将模拟长期运行的任务)更新到I'm done!
。
您可以尝试并相应地更改代码。
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class TextAreaUpdater {
private JFrame frame;
private JTextArea area;
private JButton button;
private SwingWorker<String, String> worker;
public static void main(String[] args) {
SwingUtilities.invokeLater(new TextAreaUpdater()::createAndShowGui);
}
private void createAndShowGui() {
frame = new JFrame(getClass().getSimpleName());
area = new JTextArea(10, 30);
button = new JButton("Update!");
button.addActionListener(listener);
worker = new SwingWorker<String, String>() {
@Override
protected String doInBackground() throws Exception {
try {
Thread.sleep(5000); //Simulates long running task
} catch (InterruptedException e) {
e.printStackTrace();
}
return "I'm done!"; //Returns the text to be set on the JTextArea
}
@Override
protected void done() {
super.done();
try {
area.setText(get()); //Set the textArea the text given from the long running task
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
};
frame.add(area, BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private ActionListener listener = (e -> {
area.setText("Processing...");
worker.execute(); //Initializes long running task
});
}
参考文献:
下面是另一个使用SwingWorker
的示例:打开j对话框后更新jlabel文本
希望它能帮上忙
https://stackoverflow.com/questions/47891172
复制相似问题