【问题标题】:Styleclass not being applied when the previous style class is added in FXML在 FXML 中添加上一个样式类时未应用样式类
【发布时间】:2013-09-26 21:58:58
【问题描述】:

我在 FXML 文件中分配 ToggleButton 的 styleclass 如下:

<ToggleButton fx:id="Button" styleClass="defaultStyle">

稍后,在我的代码中,我将样式类更改如下:

@FXML private ToggleButton Button;
Button.getStyleClass().remove("defaultStyle");
Button.getStyleClass().add("newStyle");

CSS文件定义为:

 .defaultStyle { -fx-background-color: black;}
 .newStyle { -fx-background-color: red;}

编辑: 在 Controller 中完成时会应用新样式,但在其他地方完成时不会应用新样式。调试时,我看到按钮添加和删除了正确的样式类。

有人有解决这个问题的方法吗?提前感谢您的帮助。

【问题讨论】:

    标签: class button styles javafx fxml


    【解决方案1】:

    样式类删除和添加按预期工作。我猜你的问题是 ToggleButton 没有正确注入,应该是:

    @FXML private ToggleButton Button;
    ...
    Button.getStyleClass().remove("defaultStyle");
    Button.getStyleClass().add("newStyle");
    

    在控制器类中。请注意“Button”的大写 b,因为您已在 FXML 文件中定义了 fx:id="Button"。另请注意,您不需要自己实例化ToggleButton Button(如new ToggleButton())。

    编辑:
    这是更改样式类的代码示例。正如我所说,它按预期工作。和你的比较一下。

    Sample.fxml:

    <AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml" fx:controller="somepackage.SampleController">
        <stylesheets>
            <String fx:value="somepackage/style.css" />
        </stylesheets>
        <children>
            <ToggleButton layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="mybutton" styleClass="defaultStyle" />
        </children>
    </AnchorPane>
    

    SampleController.java:

    package somepackage;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.ToggleButton;
    
    public class SampleController implements Initializable {
    
        @FXML
        private ToggleButton mybutton;
    
        @FXML
        private void handleButtonAction(ActionEvent event) {
            System.out.println("before :" + mybutton.getStyleClass());
            mybutton.getStyleClass().remove("defaultStyle");
            mybutton.getStyleClass().add("newStyle");
            System.out.println("after  :" + mybutton.getStyleClass());
        }
    
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            // TODO
        }
    }
    

    MainDemo.java:

    package somepackage;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    
    public class MainDemo extends Application {
    
        @Override
        public void start(Stage stage) throws Exception {
            System.out.println("version: " + com.sun.javafx.runtime.VersionInfo.getRuntimeVersion());
            Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    css 文件包含您的选择器。

    【讨论】:

    • 这里,'button'被定义为“@FXML private ToggleButton button;”我没有重新创建按钮实例。我在 GUI 中没有看到应用于 ToggleButton 的样式。 (我已经编辑了我以前的帖子以包含此更正)
    【解决方案2】:

    既然你说它只有在控制器执行时才完成。

    使用 FXMLLoader 加载您的控制器。然后将 StyleClass 更改为 newStyle。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 2011-03-03
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      相关资源
      最近更新 更多