如何控制 TextArea (JavaFX) 中的特定文本选择?
How to control specific text selection in a TextArea (JavaFX)?
我正在使用 JavaFX 并且有一个 TextArea。在 textArea 中,我需要一些方法来确保用户一次只能 select 一行。所以对于我的删除按钮,我目前拥有的是:
deleteButton.setOnAction(e -> {
String s = "DELETE: ";
s += receipt.getSelectedText();
receipt.replaceSelection(s);
});
如何强制用户一次只能 select 一行?每行都有 \n 作为分隔符,所以我想我可以知道如何将它用作键。一个问题是用户一次 select 多行或部分行的能力。是的,我必须使用 textArea。我现在有删除按钮正在读取已删除的内容并显示它。我的代码的读取在解决这个问题上效果很好。我有大约 15 类,它们都将 textAreas 作为参数,当单击按钮时,它会将其附加到 TextArea,然后将其作为特定属性保存到指定对象。我只需要突出显示控件,或者一种添加复选框的方法,或者一种读取用户点击突出显示整行的位置的方法(但如果点击其他地方,它 highlights/selects 那一行,或者尝试突出显示自己,它不允许他们)。
您可以使用 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);
}
}
我正在使用 JavaFX 并且有一个 TextArea。在 textArea 中,我需要一些方法来确保用户一次只能 select 一行。所以对于我的删除按钮,我目前拥有的是:
deleteButton.setOnAction(e -> {
String s = "DELETE: ";
s += receipt.getSelectedText();
receipt.replaceSelection(s);
});
如何强制用户一次只能 select 一行?每行都有 \n 作为分隔符,所以我想我可以知道如何将它用作键。一个问题是用户一次 select 多行或部分行的能力。是的,我必须使用 textArea。我现在有删除按钮正在读取已删除的内容并显示它。我的代码的读取在解决这个问题上效果很好。我有大约 15 类,它们都将 textAreas 作为参数,当单击按钮时,它会将其附加到 TextArea,然后将其作为特定属性保存到指定对象。我只需要突出显示控件,或者一种添加复选框的方法,或者一种读取用户点击突出显示整行的位置的方法(但如果点击其他地方,它 highlights/selects 那一行,或者尝试突出显示自己,它不允许他们)。
您可以使用 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);
}
}