java textarea append,关于Java Swing怎么实时刷新JTextArea,以显示刚才加append的内容(线程角度) | 学步园...

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) {

//捕获中断异常}

}

……

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现实时刷新JTextArea,可以使用SwingWorker类来完成。SwingWorker是一个抽象类,可以在后台线程中执行长时间运行的任务,并在完成后更新用户界面。 以下是一个简单的示例代码,用于在JTextArea实时显示内容: ``` import javax.swing.*; import java.awt.BorderLayout; public class RefreshTextAreaDemo extends JFrame { private JTextArea textArea; public RefreshTextAreaDemo() { textArea = new JTextArea(10, 30); JScrollPane scrollPane = new JScrollPane(textArea); getContentPane().add(scrollPane, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); // 启动SwingWorker线程 new AppendTextWorker().execute(); } // SwingWorker实现类 private class AppendTextWorker extends SwingWorker<Void, String> { @Override protected Void doInBackground() throws Exception { // 模拟添内容 for (int i = 0; i < 10; i++) { Thread.sleep(1000); publish("Hello, World! " + i + "\n"); } return null; } @Override protected void process(java.util.List<String> chunks) { // 添内容JTextArea for (String chunk : chunks) { textArea.append(chunk); } } } public static void main(String[] args) { new RefreshTextAreaDemo(); } } ``` 在这个例子中,我们创建了一个JFrame和一个JTextArea,并使用SwingWorker类的子类AppendTextWorker来模拟向JTextArea中添内容。在AppendTextWorker类中,我们使用doInBackground方法来执行模拟的长时间任务,并使用publish方法在后台线程中将内容到chunks列表中。在process方法中,我们将chunks列表中的内容逐一添JTextArea中,从而实现了JTextArea实时刷新。 当然,如果你只需要在后台线程中更新JTextArea内容,而不需要实时刷新,也可以使用SwingUtilities.invokeLater方法来更新界面。例如,可以使用以下代码将内容JTextArea中: ``` SwingUtilities.invokeLater(new Runnable() { public void run() { textArea.append("Hello, World!\n"); } }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值