我正在尝试创建一个非常简单的Swing UI,当处理在后台进行时,它通过JTextArea将信息记录到屏幕上。当用户单击一个按钮时,我希望每次调用:
textArea.append(someString + "\n");
立即显示在UI中。
此时,在单击按钮完成处理之前,JTextArea不会显示所有日志信息。如何让它动态刷新?
发布于 2009-03-10 04:58:00
我的应用程序也遇到了同样的问题。我的应用程序有一个"Run“按钮,它执行一些操作并将结果输出到JTextArea。我必须从Thread中调用该方法。这就是我所做的。
我有几个可以完成的操作的单选按钮,然后是一个"Run“按钮来执行那个特定的操作。我有一个名为Validate的操作。因此,当我选中该单选按钮并单击"Run“按钮时,它会调用validate()方法。因此,我首先将此方法放入实现Runnable的内部类中
class ValidateThread implements Runnable {
public void run() {
validate();
}
}
然后,我在"Run“按钮的ActionListener中调用了这个线程
runButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
// Some code checked on some radio buttons
if(radioButton.isSelected()) {
if(radioButton.getText().equals("VALIDATE")) {
Runnable runnable = new ValidateThread();
Thread thread = new Thread(runnable);
thread.start();
}
}
}
});
瞧!输出现在被发送到JTextArea。
现在,您将注意到JTextArea不会随文本一起向下滚动。因此,您需要将插入符号位置设置为
textArea.setCaretPosition(textArea.getText().length() - 1);
现在,当数据添加到JTextArea中时,它将始终向下滚动。
发布于 2009-10-17 00:32:41
试试这个:
jTextArea.update(jTextArea.getGraphics());
发布于 2009-03-10 01:30:38
正如其他人所说,这需要多线程。看看Concurrency in Swing吧。
一种解决方案是使用SwingWorker实现处理。doInBackground方法将实现处理,您将使用要附加为参数的字符串调用publish方法。然后,您的SwingWorker将覆盖process方法,接受一个字符串参数并将其附加到文本区域。
https://stackoverflow.com/questions/629315
复制