【发布时间】:2010-10-12 08:58:34
【问题描述】:
我正在尝试创建一个非常简单的 Swing UI,当处理发生在后台时,它通过 JTextArea 将信息记录到屏幕上。当用户点击一个按钮时,我希望每次调用:
textArea.append(someString + "\n");
立即显示在 UI 中。
目前,JTextArea 不会显示所有日志信息,直到单击按钮后处理完成。如何让它动态刷新?
【问题讨论】:
标签: java multithreading swing
我正在尝试创建一个非常简单的 Swing UI,当处理发生在后台时,它通过 JTextArea 将信息记录到屏幕上。当用户点击一个按钮时,我希望每次调用:
textArea.append(someString + "\n");
立即显示在 UI 中。
目前,JTextArea 不会显示所有日志信息,直到单击按钮后处理完成。如何让它动态刷新?
【问题讨论】:
标签: java multithreading swing
试试这个:
jTextArea.update(jTextArea.getGraphics());
【讨论】:
我的应用程序遇到了同样的问题。我的应用程序有一个“运行”按钮,它执行一些操作并将结果输出到 JTextArea。我不得不从一个线程调用该方法。这就是我所做的。
我有几个可以执行的操作单选按钮,然后是一个“运行”按钮来执行该特定操作。我有一个名为验证的操作。因此,当我选中该单选按钮并单击“运行”按钮时,它会调用方法 validate()。所以我先把这个方法放到了一个实现Runnable的内部类中
class ValidateThread implements Runnable {
public void run() {
validate();
}
}
然后我在“运行”按钮的 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 时,它会一直向下滚动。
【讨论】:
正如其他人所说,这需要多线程。看看Concurrency in Swing。
一种解决方案是使用 SwingWorker 实现处理。 doInBackground 方法将实现处理,您将调用 publish 方法,并将字符串作为参数附加。然后,您的 SwingWorker 将覆盖 process 方法以获取 String 参数并将其附加到文本区域。
【讨论】:
很抱歉回答了 4 年前发布的这个问题,但我有另一个对我有用的解决方案。我只是用指针来更新JTextArea这样:
//JScrollPane variable pane initialized with JTextArea area
//We will update area with new text
JTextArea temp = (JTextArea) pane.getViewPort().getView();
//new text to add
JTextArea c = new JTextArea();
c.append("text \n)";
//update through pointers
temp = c;
pane.validate();
【讨论】:
为此,您需要多线程。准备好冒险了吗?
【讨论】:
如果是多线程,你需要试试这个! http://www.devarticles.com/c/a/Java/Multithreading-in-Java/
【讨论】: