В JavaFX, как я могу переключать скины с помощью CSS?

Какое правильное место для определения Skin через CSS в JavaFX? Скажем, у меня очень простой настраиваемый элемент управления...

public class ActionLink extends Control {
    private final StringProperty text = new SimpleStringProperty();
    public final StringProperty textProperty() {return text;}
    public final String getText() {return text.get();}
    public final void setText(String text) {this.text.set(text);}
}

Я знаю, что могу указать скин по умолчанию в элементе управления. Предположим, у меня есть ActionLinkSkin...

@Override
protected Skin<?> createDefaultSkin() {
    return new ActionLinkSkin(this);
}

Если я не использую createDefaultSkin(), я вижу предупреждение SEVERE о том, что скин не может быть найден:

The -fx-skin property has not been defined in CSS for ActionLink@59ebabd \
  and createDefaultSkin() returned null.

Во-первых, я не уверен, где находится CSS элемента управления. Должен ли я использовать таблицу стилей для элемента управления, action-link.css, или я должен использовать таблицу стилей для скина, action-link-skin.css? Мне кажется, что скин и CSS будут довольно взаимозависимыми, но использование таблицы стилей для элемента управления кажется более популярным.

Во-вторых, и моя основная проблема, я не знаю, где определить -fx-skin, чтобы он правильно обнаруживался.

Теперь, если у меня правильно настроен CSS, что если я захочу включить альтернативный скин, ActionLinkButtonSkin? Есть ли способ настроить его так, чтобы родительский компонент мог выбирать любой скин через CSS? Например:

.action-link {
    -fx-skin: "ActionLinkSkin";
}

...or:

.action-link {
    -fx-skin: "ActionLinkButtonSkin";
}

person Ryan J    schedule 04.02.2015    source источник


Ответы (1)


Проблема, с которой я столкнулся, заключается в том, что я не добавлял стиль action-link в свой элемент управления. Вот полная версия моего простого элемента управления ActionLink:

public class ActionLink extends Control {
    static {
        // Stylesheets is a custom class that resides alongside my CSS files
        // and returns properly externalized locations in a convention based
        // manner.
        StyleManager.getInstance().addUserAgentStylesheet(
            Stylesheets.byConvention(ActionLink.class)
        );
    }

    private final StringProperty text = new SimpleStringProperty();
    public final StringProperty textProperty() {return text;}
    public final String getText() {return text.get();}
    public final void setText(String text) {this.text.set(text);}

    public ActionLink() {
        getStyleClass().setAll("action-link");
    }
}
person Ryan J    schedule 04.02.2015