javafx - самый простой способ изменить цвет каретки

Я хотел бы установить цвет курсора для всех текстовых входов JavaFX (например, TextField, TextArea, те, что в ComboBox: editable, DatePicker и т. д.)

Я нашел этот ответ Stackoverflow: Как изменить цвет каретки в JavaFX 2.0?

... и пример на GitHub.

Первый меняет текст и цвет каретки, что не очень хорошо. Второй расширяет класс TextFieldSkin, который уже лучше, но как его использовать в CSS?

Любая помощь приветствуется.

ОБНОВЛЕНИЕ 1:

Я нашел следующее свойство стиля CSS для элементов управления JavaFX: -fx-skin.

Теоретически это позволило бы мне установить пользовательский класс скина (-fx-skin: "package.MySkin";), однако класс скина просто не используется!

Класс выглядит следующим образом:

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, и они делают то же самое, что и я!


person Ignatiamus    schedule 12.06.2017    source источник


Ответы (1)


После нескольких проб и ошибок я решил проблему следующим образом:

Я рекурсивно собрал все TextField и элементы управления, в которых есть TextField (например, ComboBox, DatePicker и т. д.), внутри контейнера (из уважения к TitledPane, ScrollPane, SplitPane и TabPane, потому что они не публикуют своих дочерних элементов в getChildren(), поэтому чтобы вызвать метод 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));

и это было об этом.

Ваше здоровье

person Ignatiamus    schedule 17.06.2017