如何单独引用RangeSlider的每个Thumb(ControlsFX)

Nov*_*ova 2 javafx rangeslider controlsfx

我正在尝试绑定一个标签,以显示在RangeSlider的上下拇指上方.

无论用户在哪里滑动,标签的位置应始终保持在各自的拇指上方.像这样:

在此输入图像描述

在此输入图像描述

我的方法是将侦听器连接到每个拇指,这样我就可以在每次用户滑动时将标签设置为具有适当的X/Y坐标.但是,当我运行以下代码时,我似乎无法通过css选择器获得对个人拇指的引用.

我按照这篇文章,但这只使用一个拇指,因此很容易参考.你如何在我的上下文中正确使用CSS选择器,或者如果我的存在缺陷,那么更好的方法是什么?

调节器

public class SliderDemoController implements Initializable {
    @FXML
    private RangeSlider range;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        Pane thumb = (Pane) range.lookup(".range-slider .low-thumb");
        System.out.println(thumb); // <-- Prints null
    }
}
Run Code Online (Sandbox Code Playgroud)

主要

public class SliderDemoMain extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage initStage) throws IOException {
        FXMLLoader loader = new FXMLLoader(Drag.class.getClassLoader().getResource("sliderdemo.fxml"));
        Parent root = loader.load();
        Scene scene = new Scene(root);
        Stage primaryStage = new Stage();
        primaryStage.setTitle("Slider Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
Run Code Online (Sandbox Code Playgroud)

styleMain.css

.range-slider .range-bar {
    -fx-background-color: grey;
}

.range-slider .low-thumb {
     //....
}
.range-slider .high-thumb {
    //....
}
Run Code Online (Sandbox Code Playgroud)

sliderdemo.fxml的顶行

<HBox fx:id="menuBar" maxHeight="-Infinity" minHeight="-Infinity" prefHeight="79.0" stylesheets="@styleMain.css" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.propertydrop.SliderDemoController">
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 6

要使CSS查找起作用,您需要应用CSS,进行布局传递,并将节点作为场景的一部分.(请注意,在您引用的帖子中,答案中的代码会在执行查找之前仔细执行这些步骤.)

这在控制器中很难实现,因为initialize()通常在将FXML的根节点添加到场景之前调用该方法.您可以通过观察sceneProperty()节点来解决此问题,并在将其设置为非空值时进行响应.(是的,这有点像黑客......):

public class SliderDemoController implements Initializable {
    @FXML
    private RangeSlider range;
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        ChangeListener<Scene> initializer = new ChangeListener<Scene>() {
            @Override
            public void changed(ObservableValue<? extends Scene> obs, Scene oldScene, Scene newScene)  {
                if (newScene != null) {
                    range.applyCss();
                    range.getParent().layout();
                    Pane thumb = (Pane) range.lookup(".range-slider .low-thumb");
                    System.out.println(thumb); // <-- No longer null
                    range.sceneProperty().removeListener(this);
                }
            }
        };
        range.sceneProperty().addListener(initializer);
    }
}
Run Code Online (Sandbox Code Playgroud)

根据您的具体要求,您可能能够获得一些不那么难看的东西,例如在事件处理程序或滑块highValuelowValue属性上的侦听器中执行查找.