gpt4 book ai didi

java - 在执行长程序期间动态更新 JTextArea 作为控制台输出?

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

假设一个程序要执行大量方法。比如在安装一个软件安装方法时你想在JtextArea中跟踪进度。我正在执行一个需要 20 秒或更长时间才能执行的程序。我想在文本区域中显示输出,更新间隔为 50 到 100 毫秒。我该如何实现? 我使用了计时器,但它在程序执行后而不是在执行期间更新了文本区域,并且 java 线程卡住了 GUI。

   temp1.redirectOutput( textArea );
final int i = 0;

Timer timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {

String str = "";
int i = 0;
while(i < 3000){
str = "aaaa";
System.out.println(str);
i++;
}
System.out.println( new java.util.Date().toString() );
System.err.println( System.currentTimeMillis() );
}
});
timer.start();

最佳答案

使用SwingWorker来获取你的信息,也许缓存成可管理的 block ,使用worker来发布它

查看 Worker Threads and SwingWorker 了解更多详细信息

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel implements LongTimeConsumer {

private JTextArea ta;

public TestPane() {
setLayout(new BorderLayout());
ta = new JTextArea(10, 20);
add(new JScrollPane(ta));
JButton btn = new JButton("Start");
add(btn, BorderLayout.SOUTH);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
btn.setEnabled(false);
LongTimeWorker worker = new LongTimeWorker(TestPane.this);
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
LongTimeWorker worker = (LongTimeWorker) evt.getSource();
if ("state".equals(evt.getPropertyName())) {
btn.setEnabled(worker.isDone());
}
}
});
worker.execute();
}
});
}

@Override
public void contentUpdated(List<String> values) {
for (String text : values) {
ta.append(text);
ta.append("\n");
}
ta.setCaretPosition(ta.getDocument().getLength());
}

}

public interface LongTimeConsumer {
public void contentUpdated(List<String> values);
}

public class LongTimeWorker extends SwingWorker<List<String>, List<String>> {

private LongTimeConsumer consumer;

public LongTimeWorker(LongTimeConsumer consumer) {
this.consumer = consumer;
}

@Override
protected List<String> doInBackground() throws Exception {
List<String> total = new ArrayList<>(1000);
List<String> values = new ArrayList<>(100);
for (int index = 0; index < 1000; index++) {
values.add("Some more text " + index);
if (index % 100 == 0) {
total.addAll(values);
publish(values);
values = new ArrayList<>(100);
}
Thread.sleep(1);
}
if (!values.isEmpty()) {
total.addAll(values);
publish(values);
}
return total;
}

@Override
protected void process(List<List<String>> chunks) {
for (List<String> values : chunks) {
consumer.contentUpdated(values);
}
}

}
}

如果您正在使用 System.out,您还可以执行 thisthis 之类的操作

关于java - 在执行长程序期间动态更新 JTextArea 作为控制台输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44776890/

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