簡體   English   中英

控制台窗口,類似於窗口“ cmd.exe”

[英]Console windows, similar to windows “cmd.exe”

我最近編寫了一個“戰艦”程序的代碼,現在正忙於提高用戶友好度(如果這是英語中^^的合適詞)。 考慮到您可以啟動服務器,我想添加某種服務器控制台,您可以在其中獲取狀態報告(例如,“ Player 1已連接”),並可以鍵入命令(例如“ stop”)以關閉服務器。

現在,不幸的是,瀏覽了多個Google搜索結果和stackoverflow帖子后,我的印象是,沒有類似於Windows命令行(cmd.exe)的訪問控制台窗口的簡便方法-是正確的嗎? 顯然,我可以創建一個JFrame,其中一個JTextField用於輸入,一個不可編輯的JTextArea用於輸出,但是考慮到我使用System.out.println()打印的大部分內容,我覺得那不是很優雅應該在那里出現。

有任何想法嗎 ...?

JTextAreaJTextField的“控制台”有多常見?

如果以Minecraft為例,您會發現帶有用於輸入下一條命令的JTextFieldJFrame和不可編輯的JTextArea實際上很常見。

您甚至可以通過調用System.setOut()將其設置為您自己的PrintStream來攔截System.out.println()或實際上對System.out任何使用,從而將文本附加到上述JTextArea

但是,有一些事情要考慮。

您是否真的希望服務器依賴Swing?

當將JFrameJTextFieldJTextArea用於服務器控制台時,服務器無法在無頭環境中運行。 正確的服務器可以在沒有GUI的無頭環境中運行,可以使用諸如init.d (也可以作為Windows服務運行)之類的相應基礎結構在服務器操作系統上啟動。

這並不意味着您根本無法使用Swing。 但是您應該考慮策略設計模式,並讓用戶控制是為服務器啟動Swing UI,還是應僅使用stdinstderr 對於用戶來說,Swing UI也將更加困難。 他們可以簡單地通過腳本將命令序列通過管道自動發送到stdin 使用圖形用戶界面,這種自動化變得更加困難。

Java Readline庫

當將stdin / stderr用於服務器控制時,您可能希望通過使用模擬GNU readline某些行為的readline庫來使用戶感到舒適。

System.out用於日志記錄。 請改用System.err

使用System.out進行日志記錄是一個常見錯誤。 但這不是System.out目的。 System.outstdout )用於程序的輸出。 例如,這就是lsdir打印當前目錄文件的地方。 不包含程序主要輸出的消息應放在System.err

考慮一個日志框架

您想要實現的某些功能可能已在日志記錄框架中提供。 Java附帶了一個java.util.logging ,還有更多的框架供您參考。 簡單地打印到System.err或什至更糟糕的System.out ,被認為是一種非常弱的,差勁的日志記錄形式,而復雜的應用程序很快就超出了對日志記錄的需求,從而使System.err變得不盡人意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM