gpt4 book ai didi

java - 计算时在 JTextArea 中显示文本

转载 作者:行者123 更新时间:2023-11-30 06:35:25 25 4
gpt4 key购买 nike

我正在编写的应用程序包括一个 JButton 和一个 JTextArea。单击该按钮会导致长时间的计算,从而导致在 JTextArea 中显示一个文本。尽管计算时间很长,但我可以随时获得中间结果(例如,考虑一个将 pi 近似为 100 位数字的应用程序 - 每隔几秒我可以写下一个数字)。问题是,即使我写(因为按钮调用了计算而在 ActionListener 类中)将 JTextArea 的文本设置为某物,计算完成后它也不会显示,我只能看到结尾结果,计算结束后。

为什么会这样,我该如何解决?

提前谢谢你。

最佳答案

您的问题是您在主 Swing 线程 EDT 中进行长时间计算,这将卡住整个 GUI,直到该过程自行完成。一种解决方案是使用后台线程进行计算,一种简单的方法是使用 SwingWorker 为主 Swing 线程、EDT 创建线程后台,并将中间结果发布/处理到 JTextArea 中。有关 SwingWorkers 和 EDT 的更多信息,请查看此处:Concurrency in Swing

另外,如果你提供一个像样的 sscce我们可能甚至可以使用示例代码为您提供更详细的响应。

SSCCE 示例:

import java.awt.event.*;
import java.text.DecimalFormat;
import java.util.List;
import javax.swing.*;

public class InterimCalc {
private JPanel mainPanel = new JPanel();
private JTextField resultField = new JTextField(10);
private JButton doItBtn = new JButton("Do It!");
private DecimalFormat dblFormat = new DecimalFormat("0.0000000000");
private SwingWorker<Void, Double> mySwingWorker = null;

public InterimCalc() {
mainPanel.add(doItBtn);
mainPanel.add(resultField);
displayResult(0.0);

doItBtn.addActionListener(new DoItListener());
}

public void displayResult(double result) {
resultField.setText(dblFormat.format(result));
}

public JPanel getMainPanel() {
return mainPanel;
}

private class DoItListener implements ActionListener {

public void actionPerformed(ActionEvent e) {
if (mySwingWorker != null && !mySwingWorker.isDone()) {
mySwingWorker.cancel(true);
}
displayResult(0.0);
mySwingWorker = new MySwingWorker();
mySwingWorker.execute();
}
}

private class MySwingWorker extends SwingWorker<Void, Double> {

private static final int INTERIM_LENGTH = 10000; // how many loops to do before displaying

@Override
protected Void doInBackground() throws Exception {
boolean keepGoing = true;
long index = 1L;
double value = 0.0;
while (keepGoing) {
for (int i = 0; i < INTERIM_LENGTH; i++) {
int multiplier = (index % 2 == 0) ? -1 : 1;
value += (double)multiplier / (index);
index++;
}
publish(value);
}
return null;
}

@Override
protected void process(List<Double> chunks) {
for (Double dbl : chunks) {
displayResult(dbl);
}
}

}

private static void createAndShowUI() {
JFrame frame = new JFrame("Decay Const");
frame.getContentPane().add(new InterimCalc().getMainPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}

关于java - 计算时在 JTextArea 中显示文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6089878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com