我目前正在使用SceneBuilder开发JavaFX程序,该程序还利用Windows的命令行。为了向用户显示程序正在执行的操作,我希望它将控制台输出放入文本区域。到目前为止,它只是在一切完成后更新,而不是实时更新,这是我的目标。
这里是我到目前为止的代码,在该代码中输入“ tree”作为测试。 “ textareaOutput”是显示输出的文本区域:
try {
Process p = Runtime.getRuntime().exec("cmd /C tree");
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
textareaOutput.appendText(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
我知道Swing中的MessageConsole,但我不知道JafaFX中是否存在类似的内容
这里是一个简单的应用程序,具有与文本区域进行实时命令行绑定的功能。
input
(树,时间等)TextField上输入命令,然后按Enter键text-area
中>Demo
public class CommandLineTextAreaDemo extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { BorderPane root = new BorderPane(); root.setCenter(getContent()); primaryStage.setScene(new Scene(root, 200, 200)); primaryStage.show(); } private BorderPane getContent() { TextArea textArea = new TextArea(); TextField input = new TextField(); input.setOnAction(event -> executeTask(textArea, input.getText())); BorderPane content = new BorderPane(); content.setTop(input); content.setCenter(textArea); return content; } private void executeTask(TextArea textArea, String command) { Task<String> commandLineTask = new Task<String>() { @Override protected String call() throws Exception { StringBuilder commandResult = new StringBuilder(); try { Process p = Runtime.getRuntime().exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = in.readLine()) != null) { commandResult.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } return commandResult.toString(); } }; commandLineTask.setOnSucceeded(event -> textArea.appendText(commandLineTask.getValue())); new Thread(commandLineTask).start(); } }
如果要独立使用
TextArea
(不使用input
TextField,则可以执行以下操作。
textArea.setOnKeyReleased(event -> {
if(event.getCode() == KeyCode.ENTER) {
String[] lines = textArea.getText().split("\n");
executeTask(textArea, lines[lines.length - 1]);
}
});
生成一个线程来执行您的命令,然后使用以下问题的答案: