如何在TextArea(JavaFX)中控制特定的文本选择?

时间:2017-11-06 18:22:04

标签: javafx controls textarea selection

我正在使用JavaFX并拥有TextArea。在textArea中,我需要一些方法来确保用户一次只能选择一行。所以我的删除按钮到目前为止是:

.grow

如何强制执行该用户一次只能选择一个完整行?每一行都有\ n作为断路器,所以我想我可以将它作为一个关键用途。问题是用户一次选择多行或部分行的能力。是的,我必须使用textArea。我现在正在删除按钮正在读取被删除的内容并显示它。对于这个问题,我的代码的读取工作非常好。我有大约15个类,它们都将textAreas作为参数,当单击一个按钮时,它将它附加到TextArea,然后将它作为特定属性保存到指定的对象。我只需要高亮显示控件,或者添加一个复选框或一种方法来读取用户点击的内容突出整行(但是如果点击其他地方,它会突出显示/选择该行,或者尝试突出显示自己,它不会不要让他们。)

1 个答案:

答案 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);
    }
}