最近做了个javaFX的工具,想弄个控制台输出信息,准备用TextArea来模拟console,但直接操纵console对象的话不依赖这个项目的地方就无法输出信息到控制台了,至于log,以前弄过一个输出到console,log文件,和TextArea的程序,但得出的结论是很多时候log和控制台的内容是不一样的,log和console的内容应该分开,最后决定用System.out,将TextArea定为标准输出流的target。

gui的部分略过,界面弄好后,首先要做的是定义一个OutputStream,这个stream会将数据写到textArea,也就是我们的console。

System.setOut(new PrintStream(new OutputStream() {@Overridepublic void write(int b) {String text = String.value0f((char) b);Platform.runLater(() -> {console.appendText(text);});}@Overridepublic void write(byte[] b, int off, int len) {String s = new String(b, off, len);Platform. runLater(() -> console. appendText(s));}
}, true));
System.setErr(System.out);

以上的console是一个TextArea,这里值得一提的有两点

  1. Platform.runLater 这个方法会将传入的函数放入一个队列,用于更新ui,最开始我没有用这个方法结果导致控制台输出时界面时常卡死,如果不在这里用这个方法也可以选择用Task线程替代,在Task线程中控制台输出也可更新ui,但这里我又踩了个坑,用Task线程时调用System.out.println可以正常work,但调用System.out.print(char)的时候却没效果,应该是流没有及时flush的问题,不过我懒得追究了
  2. 这里把字符串的构建放到了runLater外面,一开始放在闭包里面结果输出到控制台的字节不对,部分能正常输出但部分会乱码,推测是byte[] b传入后又被更改了,所以这里要提前构建好字符串。

以上就已经实现了把System.outSystem.err输出到TextArea console的功能了,接下来在记录下把cmd的信息输出到这里

Process process = Runtime.getRuntime.exec(...);// 这里执行cmd
Charset charset = Charset.forName("gbk");
new Thread(()->{try(InputStreamReader reader = new InputStreamReader(process.getInputStream(), charset)){int read;while((read = reader.read()) != -1){System.out.print((char)read);}} catch (IOException e){e.printStackTrace();}
}).start();

这里起了一个线程是为了防止界面卡死,异步将cmd的输出流输出到System.out,这里的charset应当与cmd的编码一致,中文系统的cmd的编码是gbk而java默认编码是utf-8,所以需要创建一个gbk的字节流再输出到console,这里只输出了System.outSystem.err同理

转载于:https://www.cnblogs.com/DXDE443/p/10103824.html

javaFX的控制台实现相关推荐

  1. java tableview 双击_java-在TableView JavaFX的行上检测双击

    java-在TableView JavaFX的行上检测双击 我需要检测在TableView行上的双击. 如何侦听该行任何部分的双击并获取该行的所有数据以将其打印到控制台? 6个解决方案 108 vot ...

  2. JavaFX 学习笔记——窗口与控件

    前言 如今比较流行的桌面gui框架有WPF.WinForm.Qt.javafx等.其中WPF和WinForm目前还只能在运行Winsows上.Qt(widget)是一个很强大的跨平台C++框架(不只是 ...

  3. spring javafx_Oracle Spring Clean JavaFX应该吗?

    spring javafx 我们确实在Codename One上依赖JavaFX,我们的模拟器需要它. 我们的桌面版本使用它,而我们的设计器工具基于Swing. 我们希望它成功,这对我们的业务至关重要 ...

  4. Oracle Spring Clean JavaFX应该吗?

    我们确实在Codename One上依赖JavaFX,我们的模拟器需要它. 我们的桌面版本使用它,而我们的设计器工具基于Swing. 我们希望它成功,这对我们的业务至关重要! 即使您是Java EE开 ...

  5. JavaFX 2 GameTutorial第3部分

    介绍 Ť他是与一个六个部分组成的系列的第3部分的JavaFX 2游戏教程. 如果您错过了第1部分和第2部分 ,建议您在开始本教程之前先进行阅读. 回顾第二部分,我讨论了游戏循环的内部工作原理,其中我们 ...

  6. JavaFx教程-03JavaFX Application的生命周期

    JavaFX Application中的线程 JavaFX在运行时会创建多个线程.在不同阶段,各个线程用来执行不同的任务.有两个线程需要我们掌握: JavaFX-Launcher JavaFX App ...

  7. JavaFX打包exe+Wind+Mac+Linux多平台分发等等

    JavaFX打包exe+Wind+Mac+Linux多平台分发等等 由于此教程相对复杂,适合对java有一定掌握的同学操作,于是我又写了一篇用idea简单打包exe的教程,文章地址:https://b ...

  8. javafx 制作 24点游戏 24点计算器 24点算法

    24点我也没想到太好的办法 主要思路如下(以四个数举例): 1.先生成3个符号,数量是4* 4* 4也就是64个不同的符号数组,类似这样[+,-,*] 2.将输入的四个数与64组不同符号对应运算保留可 ...

  9. JavaFX实现网络对话程序设计(互联网程序设计课程 第2讲)

    文章目录 简单网络对话程序 1. 程序设计第一步 2. 程序设计第二步 3. 程序设计第三步 4. 建议 扩展 项目结构 完整参考代码 chapter02.TCPClient.java(客户端) ch ...

最新文章

  1. python实现卡方(Chi-Squared Test)相关性检验
  2. How to become the truely yourself?
  3. 空调c语言入门自学视频教程,本人大一,自学c语言,想问一下用哪个编程环境比较好啊?...
  4. python pexpect timeout_Python 的 pexpect 模块的问题
  5. datatable绑定comboBox显示数据[C#]
  6. 利用自己构建的网络进行鼾声识别
  7. 分分钟搞定阿里云私有Docke镜像仓库的搭建
  8. 编写DAO,通过JdbcTemplate操作数据库的实践
  9. Switch基本知识
  10. PHP mysql问号通配符个数_php – MySQL:计算每个条目的LIKE匹配数
  11. uva133-救济金发放
  12. 网易云音乐 歌词制作软件 BesLyric
  13. SLAM中边缘化与一致性
  14. V831 MP4播放+船新版本
  15. 中国石油大学《微观经济学》在线考试
  16. 监控摄像头接入GB28181平台实现监控视频直播的详细搭建流程
  17. 私有化部署文字识别SDK
  18. 百面机器学习 之 集成学习
  19. vue 2.0 图片懒加载
  20. win10麦克风权限无法开启

热门文章

  1. 在mysql中什么情况下不能指定字符集_如何为Mysql选择合适的字符集?
  2. androidstudio自动生成变量_使Eclipse或AndroidStudio的代码模板自动生成类名和方法名...
  3. firewall-cmd命令管理防火墙
  4. matlab主成分分析散点图_matlab、R软件等做主成分分析结果不同?为什么?
  5. python 必备模块和包_Python_异常和模块
  6. 多目标粒子群优化算法_基于粒子群优化的投资组合优化研究
  7. neo4j查询多跳关系的方法
  8. 条件随机场(CRF)和隐马尔科夫模型(HMM)最大区别在哪里?CRF的全局最优体现在哪里?
  9. java中的socket算法_GitHub - xiaohuiduan/pbft: pbft算法基于Socket的java实现
  10. python中解决中文乱码