动态更改JavaFXCSS属性

动态更改JavaFXCSS属性,java,css,javafx,Java,Css,Javafx,在我的FXML中,我有一个简单的滑块: <Slider fx:id="timeSlider" showTickLabels="true" GridPane.rowIndex="3" GridPane.columnIndex="0" GridPane.columnSpan="4"/> 然而,我需要这是动态的基础上有多远,我在歌曲。我已经编写了以下代码,但似乎无法应用CSS样式 song.getMediaPlayer().currentTimeProperty().addListene

在我的FXML中,我有一个简单的滑块:

<Slider fx:id="timeSlider" showTickLabels="true" GridPane.rowIndex="3" GridPane.columnIndex="0" GridPane.columnSpan="4"/>
然而,我需要这是动态的基础上有多远,我在歌曲。我已经编写了以下代码,但似乎无法应用CSS样式

song.getMediaPlayer().currentTimeProperty().addListener(new ChangeListener<Duration>() {
        @Override
        public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
            if (newValue != null && timeSlider != null) {
                timeSlider.setValue(newValue.toSeconds());
                double percentage = (newValue.toSeconds()/song.getDuration())*100;
                String css = ".slider .track{-fx-background-color: linear-gradient(to right, #90C7E0 " +
                 percentage + "%, white " + percentage + "%);}";
                timeSlider.getStyleClass().add(css);
            }
        }
    });
song.getMediaPlayer().currentTimeProperty().addListener(新的ChangeListener()){
@凌驾

在评论中的帮助下,我想出了一个解决方案

.getStyleClass.add(…)没有按照我最初的想法执行,我需要使用.setStyle(…),但是,我需要在滑块轨迹上设置样式,而不是滑块本身。这是我现在的代码

public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
            if (newValue != null && timeSlider != null) {
                double percentage = (newValue.toSeconds()/song.getDuration())*100;
                String cssValue = "-fx-background-color: linear-gradient(to right, #90C7E0 " +
                 percentage + "%, white " + percentage + "%)";
                StackPane sliderTrack = (StackPane) timeSlider.lookup(".track");
                sliderTrack.setStyle(cssValue);
                timeSlider.setValue(newValue.toSeconds());
            }
        }

public void changed(observeValue方法
getStyleClass()
返回与节点关联的CSS类名列表。这些类名用于确定外部CSS文件中的哪些规则应用于节点。您不能在此处传递CSS选择器和规则

相反,编写一个外部CSS文件,其中包含轨迹背景颜色的规则。您可以在此处使用“查找颜色”,它基本上类似于“CSS变量”。定义滑块的“查找颜色”,并在轨迹规则中使用它来设置背景色:

style.css

滑块{
-轨道颜色:白色;
}
.滑块.轨迹{
-背景色:-轨道颜色;
}
现在,在Java代码中,您可以通过在滑块上调用
setStyle(“-track color:/*someColor*/”)
来更新查找颜色的值。下面是一个快速示例:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class SliderTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Slider slider = new Slider();
        slider.valueProperty().addListener((obs, oldValue, newValue) -> {
            double percentage = 100.0 * (newValue.doubleValue() - slider.getMin()) / (slider.getMax() - slider.getMin());
            slider.setStyle("-track-color: linear-gradient(to right, #90C7E0 " + percentage+"%, white "+percentage+("%);"));
        });
        StackPane root = new StackPane(slider);
        root.setPadding(new Insets(20));
        Scene scene = new Scene(root);
        scene.getStylesheets().add("style.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

在您的应用程序中,您可以使用媒体播放器的当前时间执行相同的操作(或者只是在滑块的value属性上注册一个侦听器,因为这也在发生变化)。

百分比+“%,白色“+百分比+”%,这不应该是百分比+“%,白色“+(100个百分比)+”%“?可能是……我还没有机会玩CSS语句,因为我甚至无法应用它。现在我用更简单的“.slider.track{fx background color:linear gradient(向右,#90C7E0 50%,白色50%);}”当我尝试应用它时,它仍然不起作用,即使我将它直接放在CSS文件中,它也会起作用
提供了一个CSS类名列表,用于确定将外部CSS文件中的哪些规则应用于节点。我觉得这与此有关……有没有关于如何实现此目的的建议?您应该使用node.setStyle()这一稍微复杂的解决方案(请参阅其他答案)避免使用CSS查找,这(我的观点,其他人可能会有所不同)使它更加健壮。我肯定比我建议的解决方案更喜欢它。谢谢你的帮助!
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class SliderTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Slider slider = new Slider();
        slider.valueProperty().addListener((obs, oldValue, newValue) -> {
            double percentage = 100.0 * (newValue.doubleValue() - slider.getMin()) / (slider.getMax() - slider.getMin());
            slider.setStyle("-track-color: linear-gradient(to right, #90C7E0 " + percentage+"%, white "+percentage+("%);"));
        });
        StackPane root = new StackPane(slider);
        root.setPadding(new Insets(20));
        Scene scene = new Scene(root);
        scene.getStylesheets().add("style.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}