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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cyy089074316/article/details/9227365

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) { 
 
     //捕获中断异常} 
 
   } 
 
…… 
 
} 


展开阅读全文

怎么实时显示添加到JTextArea中的内容

05-02

[code=Java]rnimport java.awt.BorderLayout;rnimport java.awt.Dimension;rnimport java.awt.event.ActionEvent;rnimport java.awt.event.ActionListener;rnrnimport javax.swing.JButton;rnimport javax.swing.JFrame;rnimport javax.swing.JPanel;rnimport javax.swing.JScrollPane;rnimport javax.swing.JTextArea;rnrnpublic class AreaTest extends JFramernrn public static AreaTest f = null;rn public JTextArea ta = null;rn rn public AreaTest()rn rn ta = new JTextArea();rn rn JScrollPane scrollPane = new JScrollPane(ta);rn scrollPane.setPreferredSize(new Dimension(200,400));rn rn JPanel bp = new JPanel();rn rn JButton b = new JButton("开始");rn b.setPreferredSize(new Dimension(60,25));rn bp.add(b);rn b.addActionListener(new ActionListener()rn rn public void actionPerformed(ActionEvent e)rn rn PageReader pr = new PageReader(ta);rn rn );rn add(scrollPane,BorderLayout.CENTER);rn add(bp,BorderLayout.SOUTH);rn rn rn public static void main(String args[])rn rn f = new AreaTest();rn f.setTitle("AreaTest");rn f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);rn f.setSize(200, 400);rn f.setResizable(false);rn f.setVisible(true);rn rnrnrnrnimport java.io.IOException;rnimport java.io.InputStream;rnrnimport java.net.URL;rnimport java.net.URLConnection;rnimport java.util.Scanner;rnrnpublic class PageReaderrnrn public AreaTest f = null;rnrn private String charset = "utf-8";rn rn private String urlString = "http://www.baidu.com/";rn rn private StringBuffer HtmlContent = new StringBuffer();rn rn public PageReader(AreaTest f)rn rn this.f = f;rn this.startRead();rn rn rn private void startRead()rn rn tryrn rn URL url = new URL(urlString);rn URLConnection connection = url.openConnection();rn rn InputStream is = connection.getInputStream();rn Scanner in = new Scanner(is, this.charset);rn while(in.hasNextLine())rn rn f.ta.append(in.nextLine()+"\r\n");rn rn in.close();rn is.close();rn //System.out.println(HtmlContent);rn catch(IOException e)rn rn e.printStackTrace();rn rn rnrn[/code]rnrn这个是测试来着,搞了很久没搞好怎么把读取的网页内容一行行实时显示在textArea里rn我看网上有说要把费时代码加到另一个线程,但是研究了很久没搞出来rn哪位达人做过,教教小弟,谢谢了 论坛

swing 按钮点击事件中JTextArea中的内容不能正确显示

12-30

点击按钮执行一个方法,在方法的执行中我多次向JTextArea写入数据,实时的显示程序运行到了哪个地方,但是要等到这个方法执行完,我才能看到JTextArea中的信息,执行过程JTextArea内容不变。但是我如果不通过点击事件来运行这个方法,rnJTextArea的内容会实时的变换。比如在下面的程序中,我在main中直接运行这个方法就没有问题,这是为什么?rn[code=Java]rnpublic class ButtonFrame extends JFrame rn private JTextArea textArea ;rn private JButton startButton;rn private JScrollPane scrollPanel = new JScrollPane();rn rn public ButtonFrame() rn textArea = new JTextArea();rn startButton = new JButton();rn rn rn public void defaultCfg() rn this.setTitle("test");rn this.setLocation(400,300);rn this.setSize(550, 500); rn this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);rn this.setResizable(false);rn this.setVisible(true);rn rn rn public void bulidContent() rn textArea.setBounds(new Rectangle(10, 2, 271, 219));rn scrollPanel.setMinimumSize(new Dimension(400, 400));rn scrollPanel.setPreferredSize(new Dimension(475, 400));rn scrollPanel.setBounds(new Rectangle(10, 10, 261, 240));rn scrollPanel.getViewport().add(textArea, null);rn textArea.setLineWrap(true);rn rn //添加生成本地文件列表按钮rn startButton.setText("生成本地文件列表");rn startButton.addActionListener(new ActionListener() rn public void actionPerformed(ActionEvent e) rn start();rn rn );rn rn JPanel panel = new JPanel();rn panel.add(scrollPanel, null);rn panel.add(startButton, null); rn this.add(panel);rn this.setVisible(true);rn rn rn public void start() rn textArea.setText("哈哈哈哈哈......");rn try rn Thread.sleep(5000);rn catch (InterruptedException e) rn // TODO Auto-generated catch blockrn e.printStackTrace();rn rn textArea.setText("不见了");rn rn rn public static void main(String[] args) rn ButtonFrame buttonFrame = new ButtonFrame();rn buttonFrame.defaultCfg();rn buttonFrame.bulidContent();rn// buttonFrame.start();rn rn rnrn[/code]rn 论坛

没有更多推荐了,返回首页