如何控制 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);
    }
}