Java 8u40的更新
JavaFX中添加了一个CSS样式类来打开和关闭文本字段插入符号(在大多数情况下)是一个比本答案中的自定义皮肤方法更好的解决方案.
此属性可以在CSS中应用于任何文本区域或文本字段:
-fx-display-caret: false;
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅相关问题:
您可以使用自定义外观来控制文本字段插入符.

皮肤样本
允许您在构造函数中指定插入符颜色.
注意:此解决方案从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);
}
}
Run Code Online (Sandbox Code Playgroud)
样品申请
演示使用自定义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);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经为此找到了解决方法,我当然希望与您分享.如果其他人想要在用户输入之前隐藏插入符号,您可以使用:
我创建了一个更改侦听器,它更改用户输入的文本颜色.
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");
}
}
});
Run Code Online (Sandbox Code Playgroud)
确保启动时文本填充为白色,我在FXML的css文件中执行此操作:
#textfield {
-fx-text-fill: white;
}
Run Code Online (Sandbox Code Playgroud)
很抱歉打扰你这个问题.但是,这个主题在网上没有得到很好的讨论,所以我希望它对你们中的一些人有用.