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