javafx - 更改插入符号颜色的最简单方法

javafx - easiest way of changing the caret color

我想为 all JavaFX 文本输入设置插入符号颜色(例如 TextField、TextArea、ComboBox:editable、DatePicker 等...)

我找到了这个 Whosebug 答案:How to change the caret color in JavaFX 2.0?

...以及 GitHub.

上的示例

第一个确实改变了文本 插入符号的颜色,这是不好的。第二个扩展了 TextFieldSkin class,这已经更好了,但是我如何在 CSS 中使用它?

感谢任何帮助。

更新 1:

我为 JavaFX 控件找到了以下 CSS 样式 属性:-fx-skin.

这理论上允许我设置自定义皮肤 class (-fx-skin: "package.MySkin";),但是,皮肤 class 并没有被使用!

class 如下所示:

package gui;
…
public class MyTextFieldSkin extends TextFieldSkin
{
   public MyTextFieldSkin(TextField tf) {
      super(tf);
      System.out.println("MyTextFieldSkin constructor called!");
      ReadOnlyObjectWrapper<Color> farbe = new ReadOnlyObjectWrapper<>(Color.green);
      caretPath.strokeProperty().bind(farbe);
      caretPath.setStrokeWidth(1.5);
   }
}

... 并且在 CSS 中设置为:

.text-field {
   -fx-skin: "gui.MyTextFieldSkin";
}

我做错了什么?我看了AquaFX的源码,他们跟我的做法是一样的!

经过反复尝试,我通过以下方式解决了问题:

我将所有 TextField 和其中包含 TextField 的控件(如 ComboBoxDatePicker 等)递归地收集在一个容器中(出于尊重TitledPaneScrollPaneSplitPaneTabPane,因为他们没有在 getChildren() 中发布他们的 children,所以必须调用getContent() 个人方法 类 并浏览它)。

在我拥有所有 TextField 控件之后,我遍历它们并使用以下代码更改它们的 Skin

public class MyTextFieldSkin extends TextFieldSkin {
   public MyTextFieldSkin(TextField tf)
   {
      super(tf);
      ReadOnlyObjectWrapper<Color> color = new ReadOnlyObjectWrapper<>(Color.RED);
      caretPath.strokeProperty().bind(color);          
   }
}

然后我只需要打电话给

textfield.setSkin(new MyTextFieldSkin(textfield));

仅此而已。

干杯