我最近编写了一艘"战舰"程序,现在正忙于改善用户友好性(如果这是英语中的正确单词^^)。考虑到您可以启动服务器,我想添加某种服务器控制台,您可以在其中获取状态报告(例如"播放器1已连接")并且可以输入命令,例如&# 34;停止"关闭服务器。
现在不幸的是,在浏览了几个google结果& stackoverflow帖子,我的印象是没有简单的方法来访问类似于Windows的控制台窗口。命令行(cmd.exe) - 这是正确的吗?显然,我可以创建一个带有JTextField的JFrame用于输入和一个不可用的JTextArea用于输出,但我觉得这非常优雅,考虑到我打印的大部分内容都是System.out.println()
到目前为止应该出现在那里。
任何想法......?
答案 0 :(得分:1)
JTextArea
和JTextField
的“控制台”有多常见?如果您查看Minecraft,您可以看到JFrame
JTextField
用于输入下一个命令,而不可用的JTextArea
实际上很常见。
您甚至可以通过调用System.out.println()
将其设置为您自己的System.out
来拦截System.setOut()
,或实际使用PrintStream
,这会将文字附加到上述JTextArea
{1}}。
但是,有一些事情需要考虑。
当您使用JFrame
JTextField
和JTextArea
作为服务器控制台时,服务器无法在无头环境中运行。适当的服务器可以在没有GUI的无头环境中运行,可以使用相应的基础设施(如init.d
在服务器操作系统上启动它们(也可以作为Windows服务运行)。
这并不意味着你根本不能使用Swing。但是您应该考虑策略设计模式,并让用户控制是否应该为服务器启动Swing UI,或者只使用stdin
和stderr
。用户自动化Swing UI也会更加困难。他们可以简单地从脚本中自动将命令序列传递给stdin
。使用图形用户界面,这种自动化变得更加困难。
当您使用stdin
/ stderr
进行服务器控制时,您可能希望通过使用模拟GNU readline某些行为的readline库来让用户感到舒适。
System.out
不适用于记录。请改用System.err
。使用System.out
进行日志记录是一个常见错误。但这不是System.out
的用途。 System.out
(stdout
)用于程序的输出。例如,ls
或dir
打印当前目录的文件。不包含程序主要输出的邮件应改为System.err
。
您希望实现的某些功能可能已在日志记录框架中提供。有一个附带Java,java.util.logging
,还有更多的框架在野外。简单地打印到System.err
,甚至更差System.out
,被认为是一种非常弱,很差的日志记录,复杂的应用程序很快就会超过他们对日志记录的需求,使System.err
非常不满意。