javafx - easiest way of changing the caret color

…衆ロ難τιáo~ 提交于 2021-02-08 10:21:00

问题


I would like to set the caret color for all JavaFX text inputs (e.g. TextField, TextArea, the ones in ComboBox:editable, DatePicker, etc...)

I found this Stackoverflow answer: How to change the caret color in JavaFX 2.0?

... and an example on GitHub.

The first one does change the text and the caret color which is not good. The second one extends the TextFieldSkin class, which is already better, but how can I use it in CSS?

Any help is appreciated.

UPDATE 1:

I found the following CSS style property for JavaFX controls: -fx-skin.

This would theoretically allow me to set a custom skin class (-fx-skin: "package.MySkin";), however, the skin class just isn't used!

The class looks like the following:

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);
   }
}

… and is set in CSS like that:

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

What am I doing wrong? I looked at the source code of AquaFX, and they are doing it the same way as me!


回答1:


After a bit of try & error, I solved the problem in the following way:

I gathered all TextFields and controls that have TextFields in them (like ComboBox, DatePicker and so on) inside a container recursively (in deference of TitledPane, ScrollPane, SplitPane and TabPane, because they don't publish their children in getChildren(), so one has to call the getContent() method of the individual classes and scan through it).

After I had all the TextField controls, I looped over them and changed their Skin with the following code:

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

Then I just had to call

textfield.setSkin(new MyTextFieldSkin(textfield));

and that was about it.

Cheers



来源:https://stackoverflow.com/questions/44493967/javafx-easiest-way-of-changing-the-caret-color

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!