如何将监听器添加到分隔符位置?
How to add listener to divider position?
有没有办法在我调整拆分窗格大小时添加监听器?
我目前有
split.getDividers().get(0).positionProperty().addListener(new ChangeListener<Number>(){
public void changed(ObservableValue<? extends Number> observableValue, Number oldWindowWidth, Number newWindowWidth){
//code
}
});
它检测 window 或分隔符大小何时更改,但我只需要知道分隔符位置何时更改,比如我用鼠标拖动它时。有没有办法做到这一点?任何帮助将不胜感激!
没有干净的方法可以做到这一点,但可以通过在 SplitPane
.
上使用 CSS lookup 来实现
由于分频器有split-pane-divider
的CSS class 你可以从场景图中得到分频器,它们实际上是StackPane
个实例。
在这些 StackPane
上,您可以注册鼠标按下和鼠标释放事件侦听器,并更新一个 class 成员,该成员指示分隔符目前为 "in a drag"。然后在位置 属性 侦听器中,您可以检查此 class 成员:如果为真,则表示分隔线正在被鼠标移动,否则可以忽略更改。
示例:
public class Main extends Application {
// Indicates that the divider is currently dragged by the mouse
private boolean mouseDragOnDivider = false;
@Override
public void start(Stage primaryStage) throws Exception{
SplitPane sp = new SplitPane();
sp.getItems().addAll(new StackPane(), new StackPane());
sp.setDividerPositions(0.3f);
// Listen to the position property
sp.getDividers().get(0).positionProperty().addListener((obs, oldVal, newVal) -> {
if(mouseDragOnDivider)
System.out.println("It's a mouse drag to pos: " + newVal.doubleValue());
});
primaryStage.setScene(new Scene(sp, 300, 275));
sp.requestLayout();
sp.applyCss();
// For each divider register a mouse pressed and a released listener
for(Node node: sp.lookupAll(".split-pane-divider")) {
node.setOnMousePressed(evMousePressed -> mouseDragOnDivider = true);
node.setOnMouseReleased(evMouseReleased -> mouseDragOnDivider = false );
}
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
注:
由于查找仅在创建布局并应用 CSS 时有效,因此重要的是 requestLayout()
和 applyCss()
方法已经执行,并且 SplitPane
已经添加到场景图(附加到 Scene
)。
有没有办法在我调整拆分窗格大小时添加监听器?
我目前有
split.getDividers().get(0).positionProperty().addListener(new ChangeListener<Number>(){
public void changed(ObservableValue<? extends Number> observableValue, Number oldWindowWidth, Number newWindowWidth){
//code
}
});
它检测 window 或分隔符大小何时更改,但我只需要知道分隔符位置何时更改,比如我用鼠标拖动它时。有没有办法做到这一点?任何帮助将不胜感激!
没有干净的方法可以做到这一点,但可以通过在 SplitPane
.
由于分频器有split-pane-divider
的CSS class 你可以从场景图中得到分频器,它们实际上是StackPane
个实例。
在这些 StackPane
上,您可以注册鼠标按下和鼠标释放事件侦听器,并更新一个 class 成员,该成员指示分隔符目前为 "in a drag"。然后在位置 属性 侦听器中,您可以检查此 class 成员:如果为真,则表示分隔线正在被鼠标移动,否则可以忽略更改。
示例:
public class Main extends Application {
// Indicates that the divider is currently dragged by the mouse
private boolean mouseDragOnDivider = false;
@Override
public void start(Stage primaryStage) throws Exception{
SplitPane sp = new SplitPane();
sp.getItems().addAll(new StackPane(), new StackPane());
sp.setDividerPositions(0.3f);
// Listen to the position property
sp.getDividers().get(0).positionProperty().addListener((obs, oldVal, newVal) -> {
if(mouseDragOnDivider)
System.out.println("It's a mouse drag to pos: " + newVal.doubleValue());
});
primaryStage.setScene(new Scene(sp, 300, 275));
sp.requestLayout();
sp.applyCss();
// For each divider register a mouse pressed and a released listener
for(Node node: sp.lookupAll(".split-pane-divider")) {
node.setOnMousePressed(evMousePressed -> mouseDragOnDivider = true);
node.setOnMouseReleased(evMouseReleased -> mouseDragOnDivider = false );
}
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
注:
由于查找仅在创建布局并应用 CSS 时有效,因此重要的是 requestLayout()
和 applyCss()
方法已经执行,并且 SplitPane
已经添加到场景图(附加到 Scene
)。