在JavaFX8中隐藏TextField的输入插入符号

巴绍格扎德

我想在JavaFX8中隐藏TextField的输入插入符号。我已经尝试将文本填充设置为白色(我的TextField具有白色背景),但是随后我的用户输入也消失了。

问题是文本字段仍然需要焦点,因此我还想到了一些EventHandler,它侦听用户输入,并在按下某个键时将焦点放在文本字段上,但是那样我会错过第一个键入的键。

有谁知道该怎么做?还是JavaFX8中不可能?

宝石海

Java 8u40的更新

在JavaFX中添加了CSS样式类,以打开和关闭文本字段插入符,在大多数情况下,这是比自定义外观方法更好的解决方案。

此属性可以在CSS中应用于任何文本区域或文本字段:

-fx-display-caret: false;

有关更多详细信息,请参见相关问题:


您可以使用自定义外观来控制文本字段插入符号。

样本图片

样本皮肤

允许您在构造函数中指定插入号颜色。

注意:此解决方案是从com.sun类扩展而来的,因此不能保证在将来的JavaFX版本中可以继续使用。(此解决方案已针对Java8u25进行了测试,并适用于该版本)。

我建议您在JavaFX问题跟踪器中创建功能请求,以使用公开支持的方法(例如,添加新的CSS属性来控制插入符号的外观)来对插入符号进行更多控制。

import com.sun.javafx.scene.control.skin.TextFieldSkin;
import javafx.scene.control.TextField;
import javafx.scene.paint.Color;

public class TextFieldCaretControlSkin extends TextFieldSkin {
    public TextFieldCaretControlSkin(TextField textField, Color caretColor) {
        super(textField);

        setCaretColor(caretColor);
    }

    private void setCaretColor(Color color) {
        caretPath.strokeProperty().unbind();
        caretPath.fillProperty().unbind();

        caretPath.setStroke(color);
        caretPath.setFill(color);
    }
}

样品申请

演示自定义TextFieldCaretControlSkin的用法。

import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class CaretColorizer extends Application {

    @Override 
    public void start(Stage stage) throws Exception {
        TextField redCaretTextField = new TextField("Red Caret");
        redCaretTextField.setSkin(
                new TextFieldCaretControlSkin(
                        redCaretTextField,
                        Color.RED
                )
        );

        TextField noCaretTextField = new TextField("No Caret");
        noCaretTextField.setSkin(
                new TextFieldCaretControlSkin(
                        noCaretTextField,
                        Color.TRANSPARENT
                )
        );

        TextField normalTextField = new TextField("Standard Caret");

        VBox layout = new VBox(
                10,
                redCaretTextField,
                noCaretTextField,
                normalTextField
        );

        layout.setPadding(new Insets(10));
        stage.setScene(new Scene(layout));

        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章