JavaFX:如何将TextArea的操作限制为最后一行?

时间:2015-04-17 12:19:40

标签: java javafx console textarea javafx-8

我正在尝试使用JavaFX模拟shell。我想在同一个TextArea中处理输出和输入,所以我希望能够编辑并写入提示所在的TextArea的最后一行,就像一个shell。 / p>

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:3)

如果在编辑发生点之后有换行符,您可以继承TextArea并阻止对文本进行更改。根据{{​​3}},您需要覆盖的唯一方法是replaceText()replaceSelection

这是一个简单的例子:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class ConsoleTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setScene(new Scene(new BorderPane(new Console()), 600, 600));
        primaryStage.show();
    }

    public static class Console extends TextArea {
        @Override
        public void replaceText(int start, int end, String text) {
            String current = getText();
            // only insert if no new lines after insert position:
            if (! current.substring(start).contains("\n")) {
                super.replaceText(start, end, text);
            }
        }
        @Override
        public void replaceSelection(String text) {
            String current = getText();
            int selectionStart = getSelection().getStart();
            if (! current.substring(selectionStart).contains("\n")) {
                super.replaceSelection(text);
            }
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

如果你想显示一个提示(当然不可编辑),那么逻辑就有点棘手,但应该相当简单。对于传递给这些方法的text参数包含换行符的情况,您可能还需要一些特殊处理。