Java,console输出实时的转向GUI textbox

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java,console输出实时的转向GUI textbox脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1 简单入门例子

  入门例子是从参考文献2与3中粘过来的内容。
  在Swing中,如果需要重定向System.err和System.out到一个JTextPane或一个JTextArea,你仅需要覆写OutputStream类的wrITe()方法,以追加文本到文本组件。下面给一个关于JTextArea的例子。

PRivate JTextArea textArea = new JTextArea(4, 25);  // 本质上相当于多线程的更新JTextArea内容 private void updateTextArea(final String text) {   SwingUtilities.invokeLater(new Runnable() {     public void run() {       textArea.apPEnd(text);     }   }); }   private void redirectSystemStreams() {   OutputStream out = new OutputStream() {     @override     public void write(int b) throws IOException {       updateTextArea(String.valueOf((char) b));     }       @Override     public void write(byte[] b, int off, int len) throws IOException {       updateTextArea(new String(b, off, len));     }       @Override     public void write(byte[] b) throws IOException {       write(b, 0, b.length);     }   };     System.setOut(new PrintStream(out, true));   System.setErr(new PrintStream(out, true)); }  @test public void run() {      // 使用,调用redirectSystemStreams()即可。          redirectSystemStreams();       // 下面这句话会转向textArea中输出      System.out.println("hello, world"); }

2 实时输出问题

  redirectSystemStreams方法,本质上是多线程的更新JTextArea内容。在处理Swing上的点击事件时,事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况。
  因此,在Swing点击事件结束后,更新JTextArea内容的线程才能运行,这样的效果是内容输出是非实时的。
  怎样解决这个问题呢?在事件处理函数里面,重开一个线程,在这个新开的线程里面,执行比较耗时的计算与相应的打印内容。这样的话,事件处理函数所在的线程会快速的线束,其它更新Swing的JTextArea内容的线程才能被执行。
  下面以伪代码的形式,给出一个例子,说明事件处理函数的写法。

public class InstallBTnListener implements ActionListener {      // 日志页面类,该类有一个JTextArea属性,是打印内容目标输出位置;     private LOGFrame logFrame = new LogFrame();              public InstallBtnListener() {         super();                          // 使输出转向JTextArea;         // 这里我封闭了个类,重点是,将JTextArea传过去,且调用redirectSystemStreams方法         new RedirectingPrint(logFrame.getTextArea()).redirectSystemStreams();     }      @Override     public void actionPerformed(ActionEvent e) {                      // 在事件处理函数里面,重开一个线程,在这个新开的线程里面,执行比较耗时的计算与相应的打印内容         new Thread(new Runnable() {             @Override             public void run() {                                                 // 比较耗时的计算与相应的打印内容代码写在这里                                             }         }).start();              } }  // JButton点击事件  jbutton.addActionListener(new InstallBtnListener());

3 总结

  以上,就解决了输出实时性的问题。
  下面有一段话,从参考文献1中粘过来的,用它来总结下这个问题。

一般说来,耗时的操作不应该在事件处理方法中执行,因为事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况,所以在独立的线程上执行比较耗时的操作可能更好,这会立即更新用户界面和释放事件派发线程去派发其他的事件。

4 参考文献

[1] https://blog.csdn.net/yiziwei...java基础学习总结——java.awt.EventQueue.invokeLater干什么用的)
[2] https://billwaa.wordpress.com... ([Java] GUI Console Output)
[3] http://unserializableone.blog... (Redirecting System.out and System.err to JTextPane or JTextArea)
[4] https://stackoverrun.com/cn/q... (如何在eclipse中打印到textArea而不是控制台?)
[5] https://stackoverflow.com/que...

脚本宝典总结

以上是脚本宝典为你收集整理的Java,console输出实时的转向GUI textbox全部内容,希望文章能够帮你解决Java,console输出实时的转向GUI textbox所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。