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
的控件(如 ComboBox
、DatePicker
等)递归地收集在一个容器中(出于尊重TitledPane
、ScrollPane
、SplitPane
和 TabPane
,因为他们没有在 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));
仅此而已。
干杯
我想为 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
的控件(如 ComboBox
、DatePicker
等)递归地收集在一个容器中(出于尊重TitledPane
、ScrollPane
、SplitPane
和 TabPane
,因为他们没有在 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));
仅此而已。
干杯