我如何实时更新TextArea的输入?

问题描述 投票:1回答:2

我目前正在使用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中是否存在类似的内容

java javafx console output textarea
2个回答
1
投票

这里是一个简单的应用程序,具有与文本区域进行实时命令行绑定的功能。

  • 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]);
    }
});

1
投票

生成一个线程来执行您的命令,然后使用以下问题的答案:

© www.soinside.com 2019 - 2024. All rights reserved.