在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";
}
答案 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");
}
}