Java Swing如何实时刷新JTextArea,以显示刚才加append的内容
在代码中执行完textArea.append("message")后,如果你想让这个更新立刻显示在界面上而不是等swing的主线程返回后刷新,我们一般会在该语句后调用textArea.invalidate()和textArea.repaint()。问题是这个方法并不能有任何效果,textArea的内容没有任何变化,这或许是swing的一个bug,有一个笨拙的办法可以实现这个效果,就是执行以下语句textArea.paintImmediately(textArea.getBounds());
或
textArea.paintImmediately(textArea.getX(), textArea.getY(), textArea.getWidth(), textArea.getHeight());
这时,你会发现你刚才增加的消息已经被实时地显示出来了。
1 楼 saga_java 2012-06-07
你确信textArea.append("message")是运行在swing事件处理线程上?
SwingUtilities.invokeLater(new Runnable()
{@Overridepublic void run()
{textArea.append("message");
}
});
2 楼 周凡杨 2012-06-07
应该是在Frame窗口的线程上,因为我点击按钮后,去进行数据处理,数据处理需要很长时间,此时按钮一直呈现的是被点击的样式,Frame线程被阻塞了,所以textArea.append("message");运行后,文本框里没有实时的呈现出来!而且现在还有另一种方法,就是在处理数据时,另起一个线程,此时不管处理数据需要多长时间,textArea.append("message");运行后,文本框里会实时呈现出来!
3 楼 saga_java 2012-06-07
比较耗费时间的操作不应该在swing事件处理线程上,只有另起一个线程
实例
其他外类对jTextArea进行实时更新显示时,首先要将jTextArea设置为public static,比如有主窗口Frame,其带有一个jTextArea,要把Data所获取的数据实时更新到Frame的jTextArea中。则:
假定主窗口Frame类为:
class Frame extends jFrame implements ……{
//设置jTextArea
public static jTextArea jtextarea;
……
public Frame (){//构造函数
jtextarea =new jtTextarea ();
……
ShowData();//假设创建主窗体时,就要获取,并显示数据
……
}
public void ShowData(){
new Thread(new Runnable() {//启动数据获取,更新显示进程
public void run() {
Data d = new Data();
d. outData();
}
}).start(); //
}
……
}
假定数据类Data为:
class Data{
……
public Data(){
……
}
……
//假设数据为一个自增数,不断输出数据
public void outData(){
for(int i=0; i<10000;i++)
Frame.jtextarea.append( "当前数据为:"+i+"\n"); //调用主窗口的jtextarea进行添加数据,显示
try {
Thread.currentThread().sleep(100);//让当前的进程睡眠若干毫秒,更加显示出动态更新效果,当然这将耗时
} catch (InterruptedException ex) {
//捕获中断异常}
}
……
}