JavaFX-以编程方式向标签添加样式而不覆盖
我想根据条件向标签添加样式。当我尝试此操作时,它会覆盖以前的样式。有没有更好的方式来展示这些风格JavaFX-以编程方式向标签添加样式而不覆盖,java,css,javafx,Java,Css,Javafx,我想根据条件向标签添加样式。当我尝试此操作时,它会覆盖以前的样式。有没有更好的方式来展示这些风格 Label lbl = new Label(labelDescription.getLabelText()); if (labelDescription.getLabelStyling() == LabelStyling.BOLD) { lbl.setStyle("-fx-font-weight: bold;"); } if (
Label lbl = new Label(labelDescription.getLabelText());
if (labelDescription.getLabelStyling() == LabelStyling.BOLD) {
lbl.setStyle("-fx-font-weight: bold;");
}
if (labelDescription.getLabelStyling() == LabelStyling.ITALIC) {
lbl.setStyle("-fx-font-style: italic;");
}
if (labelDescription.getTextSize() != null) {
lbl.setStyle("-fx-font-size: " + labelDescription.getTextSize() + "px;");
}
我认为您的案例更容易重构一点样式逻辑,如下所示:
Label lbl = new Label(labelDescription.getLabelText());
String style = "";
if (labelDescription.getLabelStyling() == LabelStyling.BOLD) {
style += "-fx-font-weight: bold;";
}
if (labelDescription.getLabelStyling() == LabelStyling.ITALIC) {
style += "-fx-font-style: italic;";
}
if (labelDescription.getTextSize() != null) {
style += "-fx-font-size: " + labelDescription.getTextSize() + "px;";
}
lbl.setStyle(style);
如果设置超过这3个值,这可能是非常低效的,您应该考虑使用
希望有帮助 注意,您可以通过编程方式设置字体,而无需使用CSS:
Label lbl = new Label(labelDescription.getLabelText());
// get defaults:
Font font = lbl.getFont();
String family = font.getFamily();
double size = font.getSize();
FontPosture posture = FontPosture.REGULAR ;
FontWeight weight = FontWeight.NORMAL ;
if (labelDescription.getLabelStyling() == LabelStyling.BOLD) {
weight = FontWeight.BOLD ;
}
if (labelDescription.getLabelStyling() == LabelStyling.ITALIC) {
posture = FontPosture.ITALIC ;
}
if (labelDescription.getTextSize() != null) {
size = labelDescription.getTextSize();
}
lbl.setFont(Font.font(family, weight, posture, size));
如果您真的想使用CSS,您可以通过字符串连接来构建样式,或者对于字体大小和样式,使用外部样式表和自定义CSS伪类
例如:
标签样式.css
:
/*
请注意,您必须使用支持
系统上的粗体、斜体和粗体斜体。
*/
#我的标签{
-fx字体系列:“Arial”;
}
#我的标签:重要{
-fx字体大小:粗体;
}
#我的标签:强调{
-fx字体样式:斜体;
}
我通常更喜欢这种方法,因为它可以更容易地通过编程方式更改样式,以逻辑方式响应应用程序中状态的更改。对于颜色,可以使用“查找颜色”。唯一的缺点是我知道没有办法改变字体大小,所以这些仍然需要通过内联样式来完成
下面是一个完整的示例,使用该示例根据用户输入设置伪类:
import javafx.application.Application;
import javafx.css.PseudoClass;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.Spinner;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class LabelStyleTest extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
VBox root = new VBox(5);
root.setAlignment(Pos.CENTER);
CheckBox important = new CheckBox("Important");
CheckBox emphasized = new CheckBox("Emphasized");
Spinner<Integer> size = new Spinner<>(4, 36, 12);
HBox sizeBox = new HBox(2, new Label("Size:"), size);
sizeBox.setAlignment(Pos.CENTER);
Label label = new Label("A label");
label.setId("my-label");
PseudoClass importantPC = PseudoClass.getPseudoClass("important");
PseudoClass emphasizedPC = PseudoClass.getPseudoClass("emphasized");
important.selectedProperty().addListener((obs, wasSelected, isNowSelected) ->
label.pseudoClassStateChanged(importantPC, isNowSelected));
emphasized.selectedProperty().addListener((obs, wasSelected, isNowSelected) ->
label.pseudoClassStateChanged(emphasizedPC, isNowSelected));
size.valueProperty().addListener((obs, oldSize, newSize) ->
label.setStyle("-fx-font-size: "+newSize+" px;"));
root.getChildren().addAll(important, emphasized, sizeBox, label);
Scene scene = new Scene(root, 800, 500);
scene.getStylesheets().add("label-style.css");
primaryStage.setScene(scene);
primaryStage.show();
}
}
对于像这样的任务,我建议使用基于CSS样式表中定义的类(或者如果您希望有点花哨,可以使用伪类),而不是使用直接样式字符串。与样式字符串相比,样式类的一个优点是可以在集合中添加和删除这些类,因此添加多个样式类不会覆盖以前的样式类。
Label lbl = new Label(labelDescription.getLabelText());
lbl.setId("my-label");
PseudoClass importantPC = PseudoClass.getPseudoClass("important");
PseudoClass emphasizedPC = PseudoClass.getPseudoClass("emphasized");
lbl.pseudoClassStateChanged(importantPC,
labelDescription.getLabelStyling() == LabelStyling.BOLD));
lbl.pseudoClassStateChanged(emphasizedPC,
labelDescription.getLabelStyling() == LabelStyling.ITALIC);
if (labelDescription.getTextSize() != null) {
lbl.setStyle("-fx-font-size: " + labelDescription.getTextSize() + "px;");
}