在JavaFX中,如何使用CSS切换外观?

时间:2015-02-04 19:28:48

标签: javafx-8 javafx-css

在JavaFX中通过CSS定义Skin的正确位置是什么?假设我有一个非常简单的自定义控件...

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

...或:

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

1 个答案:

答案 0 :(得分:0)

我在这里遇到的问题是我没有将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");
    }
}