我正在使用JavaFX并拥有TextArea。在textArea中,我需要一些方法来确保用户一次只能选择一行。所以我的删除按钮到目前为止是:
.grow
如何强制执行该用户一次只能选择一个完整行?每一行都有\ n作为断路器,所以我想我可以将它作为一个关键用途。问题是用户一次选择多行或部分行的能力。是的,我必须使用textArea。我现在正在删除按钮正在读取被删除的内容并显示它。对于这个问题,我的代码的读取工作非常好。我有大约15个类,它们都将textAreas作为参数,当单击一个按钮时,它将它附加到TextArea,然后将它作为特定属性保存到指定的对象。我只需要高亮显示控件,或者添加一个复选框或一种方法来读取用户点击的内容突出整行(但是如果点击其他地方,它会突出显示/选择该行,或者尝试突出显示自己,它不会不要让他们。)
答案 0 :(得分:1)
您可以使用TextFormatter
中的过滤器来拦截和修改对所选内容的更改。
这是一个简单的例子。您也可以修改更改以实际影响您在删除时查找的功能。
import java.util.function.UnaryOperator;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.stage.Stage;
public class TextAreaSelectByLine extends Application {
@Override
public void start(Stage primaryStage) {
TextArea textArea = new TextArea();
UnaryOperator<Change> filter = c -> {
int caret = c.getCaretPosition();
int anchor = c.getAnchor() ;
if (caret != anchor) {
int start = caret ;
int end = caret ;
String text = c.getControlNewText();
while (start > 0 && text.charAt(start) != '\n') start-- ;
while (end < text.length() && text.charAt(end) != '\n') end++ ;
c.setAnchor(start);
c.setCaretPosition(end);
}
return c ;
};
TextFormatter<String> formatter = new TextFormatter<>(filter);
textArea.setTextFormatter(formatter);
Scene scene = new Scene(textArea, 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}