0

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

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

1 回答 1

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");
    }
}
于 2015-02-04T23:41:11.883 回答