javaFX的控制台实现
最近做了个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() {
@Override
public void write(int b) {
String text = String.value0f((char) b);
Platform.runLater(() -> {
console.appendText(text);
});
}
@Override
public 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,这里值得一提的有两点
Platform.runLater
这个方法会将传入的函数放入一个队列,用于更新ui,最开始我没有用这个方法结果导致控制台输出时界面时常卡死,如果不在这里用这个方法也可以选择用Task线程替代,在Task线程中控制台输出也可更新ui,但这里我又踩了个坑,用Task线程时调用System.out.println可以正常work,但调用System.out.print(char)的时候却没效果,应该是流没有及时flush的问题,不过我懒得追究了- 这里把字符串的构建放到了runLater外面,一开始放在闭包里面结果输出到控制台的字节不对,部分能正常输出但部分会乱码,推测是
byte[] b
传入后又被更改了,所以这里要提前构建好字符串。
以上就已经实现了把System.out
和System.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.out
,System.err
同理
javaFX的控制台实现的更多相关文章
- Visual Studio 2012 开发环境配置+控制台工具+桌面应用程序
一.界面布局视图设置 1.窗口的布局.控制台窗口运行恢复到开发环境的设置方法 也可以保存好设好的个性化设置,导入设置: 2.视图|服务器资源管理器(sever explorer) 可以访问数据源.服务 ...
- spring+mybatis+javafx
@Service用于标注业务层组件 @Controller用于标注控制层组件(如struts中的action) @Repository用于标注数据访问组件,即DAO组件. @Component泛指组件 ...
- JavaFX桌面应用开发-Button(按钮)与事件
1:Button样式的操作原始代码: package application; import javafx.application.Application;import javafx.scene.Gr ...
- 第八章 Fisco Bcos 国密版本的部署、控制台搭建、合约的部署、sdk 调用
鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 参考资料 证书说明:https://mp.wei ...
- JavaFX FileChooser文件选择器、DirectoryChooser目录选择器
参考:https://www.yiibai.com/javafx/javafx_filechooser.html 参考:https://blog.csdn.net/dorma_bin/article/ ...
- 【原创】JavaFx程序解决Jupyter Notebook导出PDF不显示中文
0.ATTENTION!!! JavaFx里是通过Java调用控制台执行的的jupyter和xelatex指令, 这些个指令需要在本地安装Jupyter和MikTeX之后才能正常在电脑上运行 1.[问 ...
- .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来
从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...
- .NET Core的日志[2]:将日志输出到控制台
对于一个控制台应用,比如采用控制台应用作为宿主的ASP.NET Core应用,我们可以将记录的日志直接输出到控制台上.针对控制台的Logger是一个类型为ConsoleLogger的对象,Consol ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
随机推荐
- apose和spire操作word
Apose public void doSaveAsword(Dictionary<string,string> dict) { //--------------------------- ...
- 一键发布部署vs插件[AntDeploy]开源了
deploy to remote server by one button click 功能 支持docker一键部署(支持netcore) 支持iis一键部署(支持netcore和framework ...
- Xcode: Run Script 的运用, 使build打包后自动+1
背景: 每次打包都要build+1处理,比较麻烦,使用 Run Script 的运用使build打包后自动+1 0. 使用xcode 添加run Script 然后就可以添加Run Script了 1 ...
- Linux操作系统计划任务
++++++++++++++++++++++++++++++++++++++++++++++++标题:Linux操作系统的计划任务内容:计划任务分为单次任务和周期性任务,周期任务分为系统级计划任务和用 ...
- Git操作记录
记录一些用过的操作 增加远程推送分支 git remote add orgin http://xxxxx.git 直接新建本地分支,将远程分支提取出来. git checkout -t origin/ ...
- python3 使用ssl安全连接发送邮件
今天在测试,阿里云服务器发邮件时,发现使用默认的25端口,邮件无法正常发送,查了相关的资料,才知道,大部分的云服务器都会禁用25端口,所以才想到使用ssl 发送. 下面为具体的python3 使用ss ...
- 正则化(Regularization)本质
参考: http://www.cnblogs.com/maybe2030/p/9231231.html https://blog.csdn.net/wsj998689aa/article/detail ...
- METO CODE 223 拉力赛
传送门 继续水板子题... #include <bits/stdc++.h> #define ll long long using namespace std; inline int re ...
- ubuntu配置ssh连接方式
pgadmin4 配置界面的password指的是数据库用户的密码, 不是服务器的密码. pg数据库 1.确保远程服务器开放相应端口.这个是在防火墙设置. 2.pg数据库服务器允许外部ip访问, 默认 ...
- 谈谈JavaScript中继承方式
聊一聊js中的继承 一.简单继承---使用原型赋值的方式继承,将实例化的对象,赋值给子级的原型 父级构造函数 function Parent(param) { this.name = 'parent' ...