【问题标题】:Dynamically change JavaFX css property动态更改 JavaFX css 属性
【发布时间】:2018-11-06 05:48:41
【问题描述】:

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

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

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

现在,当旋钮向下滑动时,我正在尝试将左侧部分(已播放)着色为蓝色,将右侧部分(尚未播放)着色为白色。如果我将此行硬编码到我的 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 添加为样式有关,因为即使添加简单的非动态样式也不起作用。我没有收到任何错误,所以我不确定我做错了什么。

感谢您提供任何帮助,也感谢您提供更好的方法来完成此任务。谢谢!

【问题讨论】:

  • percentage + "%, white" + percent + "% 不应该是百分比 + "%, white" + (100-percentage )+ "%"吗?
  • 它可能是......我没有机会使用 CSS 语句,因为我什至无法应用它。现在我已经用更简单的“.slider .track {-fx-background-color:linear-gradient(to right, #90C7E0 50%, white 50%);}”交换了动态css,但它仍然没有当我尝试应用它时工作,即使我直接将它放在 CSS 文件中它确实有效。
  • 样式类不能像这样工作:getStyleClass() 给出了一个 CSS 类名 列表,用于确定外部 css 文件中的哪些规则应用于节点。
  • 我感觉这与此有关...有什么建议可以代替我完成此任务吗?
  • 你应该使用 Node.setStyle()

标签: java css javafx


【解决方案1】:

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

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

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

【讨论】:

  • 稍微复杂一点的解决方案(见其他答案)避免使用 CSS 查找,这(我认为,其他人可能会有所不同)使它更加健壮。
【解决方案2】:

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

相反,编写一个包含轨道背景颜色规则的外部 CSS 文件。您可以在这里使用“查找颜色”,它基本上就像“CSS 变量”一样工作。为滑块定义“查找颜色”,并在轨道的规则中使用它来设置背景颜色:

style.css:

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

现在,在 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 属性上注册一个侦听器,因为它也会发生变化)。

【讨论】:

  • 我绝对比我提出的解决方案更喜欢这个。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
相关资源
最近更新 更多