在 JavaFX 中,如何使用 CSS 切换外观?
In JavaFX, how can I switch skins using 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 select 任一皮肤?例如:
.action-link {
-fx-skin: "ActionLinkSkin";
}
...或:
.action-link {
-fx-skin: "ActionLinkButtonSkin";
}
我在这里遇到的问题是我没有将 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");
}
}
在 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 select 任一皮肤?例如:
.action-link {
-fx-skin: "ActionLinkSkin";
}
...或:
.action-link {
-fx-skin: "ActionLinkButtonSkin";
}
我在这里遇到的问题是我没有将 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");
}
}