java jtextarea 显示_java – 在计算时在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 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 {

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 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();

}

});

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值