JavaFX:如何将TextArea的操作限制到最后一行?
我正在尝试使用JavaFX模拟一个shell。我希望在同一文本区域中处理输出和输入,因此我希望能够编辑和写入提示所在的文本区域的最后一行,就像一个shell一样JavaFX:如何将TextArea的操作限制到最后一行?,java,javafx,console,textarea,javafx-8,Java,Javafx,Console,Textarea,Javafx 8,我正在尝试使用JavaFX模拟一个shell。我希望在同一文本区域中处理输出和输入,因此我希望能够编辑和写入提示所在的文本区域的最后一行,就像一个shell一样 有什么办法吗?您可以将TextArea子类化,如果在编辑点之后有换行符,则可以防止对文本进行更改。根据,您需要覆盖的唯一方法是replaceText()和replaceSelection 下面是一个简单的例子: import javafx.application.Application; import javafx.scene.Scen
有什么办法吗?您可以将
TextArea
子类化,如果在编辑点之后有换行符,则可以防止对文本进行更改。根据,您需要覆盖的唯一方法是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
参数包含换行符的情况,您可能还需要一些特殊处理。我建议使用透明样式的textfield作为输入,使用text或TextFlow作为输出。将它们一个接一个地放到VBox中。@UlukBiy滚动会很奇怪,但是,不会吗?@James_D,它可以通过使用其他布局和绑定来管理,但是下面的答案更简洁。