我试图将标签绑定在RangeSlider的上下拇指上方。
无论用户在哪里滑动,标签的位置都应始终保持在各自的拇指上方。像这样:
我的方法是将听众附加到每个拇指,以便我可以设置标签,以便每次用户滑动时都有适当的X / Y坐标。但是,当我运行以下代码时,我似乎无法通过css选择器获得对个人拇指的引用。
我跟着this post,但这只使用一个拇指,因此很容易引用。如何在我的上下文中正确使用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
}
}
主要
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();
}
}
styleMain.css
.range-slider .range-bar {
-fx-background-color: grey;
}
.range-slider .low-thumb {
//....
}
.range-slider .high-thumb {
//....
}
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">
答案 0 :(得分:6)
要使CSS查找起作用,您需要应用CSS,进行布局传递,并将节点作为场景的一部分。 (请注意,在您引用的帖子中,答案中的代码会在执行查找之前仔细执行这些步骤。)
这在控制器中很难实现,因为通常在将FXML的根节点添加到场景之前调用initialize()
方法。您可以通过观察节点的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);
}
}
根据您的具体要求,您可能可以使用稍微不那么丑陋的东西,例如在事件处理程序或滑块的highValue
或lowValue
属性上执行查找