动态更改JavaFXCSS属性
在我的FXML中,我有一个简单的滑块:动态更改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
<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);
}
}