gpt4 book ai didi

java - 动态更改 JavaFX css 属性

转载 作者:行者123 更新时间:2023-11-30 02:09:24 34 4
gpt4 key购买 nike

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

<Slider fx:id="timeSlider" showTickLabels="true" GridPane.rowIndex="3" GridPane.columnIndex="0" GridPane.columnSpan="4"/>

这个 slider 是我正在编写的桌面音乐应用程序的一部分,它表示歌曲已经播放了多远。我编写了一个更改事件,每次更改歌曲时间时都会调用该事件,这成功地完成了向下滑动旋钮/拇指。

现在,当旋钮向下滑动时,我还尝试将左侧部分(已播放)着色为蓝色,将右侧部分(尚未播放)着色为白色。如果我将这一行硬编码到我的 CSS 中,我可以在 50% 标记处实现从蓝/白的淡入淡出。

.slider .track {-fx-background-color: linear-gradient(to right, #90C7E0 50%, white 50%);}

但是,我需要根据我在歌曲中的位置来动态调整。我编写了以下代码,但似乎无法应用 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);
}
}
});

我相信这与我添加 CSS 作为样式的方式有关,因为即使添加简单的非动态样式也不起作用。我没有收到任何错误,所以我不确定我做错了什么。

感谢任何帮助,也感谢实现此目标的更好方法。谢谢!

最佳答案

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

相反,请编写一个外部 CSS 文件,其中包含轨道背景颜色的规则。您可以在这里使用“查找到的颜色”,它的工作原理基本上类似于“CSS 变量”。定义 slider 的“查找颜色”,并在轨道规则中使用它来设置背景颜色:

style.css:

.slider {
-track-color: white ;
}
.slider .track {
-fx-background-color: -track-color ;
}

现在,在 Java 代码中,您可以通过调用 slider 上的 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);
}
}

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

关于java - 动态更改 JavaFX css 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50552728/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com