当前位置: 首页 > news >正文

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...

相关文章:

  • SpringBoot 日志框架
  • Expression.Bind()方法的应用
  • python基础----特性(property)、静态方法(staticmethod)、类方法(classmethod)、__str__的用法...
  • Extjs 4 grid中的checkbox的加载时预选中【默认选中】
  • java: -source 1.6 中不支持 switch 中存在字符串.....
  • Python中大名鼎鼎的face_recognition使用
  • Spark 触发Job提交
  • 【bzoj1013】[JSOI2008]球形空间产生器sphere
  • 与众不同 windows phone (44) - 8.0 位置和地图
  • 小程序开发之获取小程序二维码
  • Android Contextual Menus之二:contextual action mode
  • 基本类型和引用类型的值 动态的属性
  • JVM启动参数小结
  • java B2B2C源码电子商务平台 -----客户端负载均衡策略
  • 八年技术加持,性能提升10倍,阿里云HBase 2.0首发商用
  • angular2开源库收集
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas 绘制双线技巧
  • HTML中设置input等文本框为不可操作
  • java8 Stream Pipelines 浅析
  • php ci框架整合银盛支付
  • Python学习之路13-记分
  • react-native 安卓真机环境搭建
  • React系列之 Redux 架构模式
  • REST架构的思考
  • Vue 2.3、2.4 知识点小结
  • Vue--数据传输
  • 阿里云Kubernetes容器服务上体验Knative
  • 程序员该如何有效的找工作?
  • 给新手的新浪微博 SDK 集成教程【一】
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 写给高年级小学生看的《Bash 指南》
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Linux权限管理(week1_day5)--技术流ken
  • (03)光刻——半导体电路的绘制
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)插入排序
  • (转)【Hibernate总结系列】使用举例
  • (转)甲方乙方——赵民谈找工作
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .Net CF下精确的计时器
  • .NET Core 2.1路线图
  • .net反编译工具
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET中使用Redis (二)
  • @Bean有哪些属性
  • [ linux ] linux 命令英文全称及解释
  • [C#]C#学习笔记-CIL和动态程序集
  • [cb]UIGrid+UIStretch的自适应