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

问题描述 投票:0回答:2

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

问题是文本字段仍然需要焦点,所以我还想到了一些 EventHandler 来监听用户输入,并在按下某个键时将焦点集中在文本字段上,但这样我就会错过输入的第一个键。

有人知道怎么做吗?或者在JavaFX8中不可能吗?

javafx focus textfield javafx-8 caret
2个回答
12
投票

JavaFX 11+ 更新

私有文本字段皮肤 API 已公开,因此可以在不破坏模块化封装的情况下进行子类化。

要使用现代 JavaFX 版本,需要更改此答案中代码示例的导入语句以使用

javafx.scene.control.skin.TextFieldSkin
的公共包。

进一步讨论见:

Java 8u40 更新

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

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

-fx-display-caret: false;

更多详情请参阅相关问题:


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

sample image

皮肤样本

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

注意:此解决方案扩展自 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);
    }
}

6
投票

我已经找到了解决方法,当然我想与您分享。如果其他人想在用户输入之前隐藏插入符号,您可以使用此:

我创建了一个更改侦听器,它会更改用户输入的文本颜色。

textfield.textProperty().addListener(new ChangeListener<String>(){

        @Override
        public void changed(ObservableValue<? extends String> observable,
                String oldValue, String newValue) {

            if (!textfield.getText().trim().isEmpty()) {
                textfield.setStyle("-fx-text-fill: black");
            } else {
                textfield.setStyle("-fx-text-fill: white");
            }

        }

});

确保启动时文本填充为白色,我在 FXML 的 css 文件中执行此操作:

#textfield {
    -fx-text-fill: white;
}

很抱歉这个问题打扰了大家。然而,这个主题在网上讨论得不多,所以我希望它对你们中的一些人有用。

© www.soinside.com 2019 - 2024. All rights reserved.