如何将监听器添加到分频器位置?
问题描述:
有没有办法在调整我的分割窗格大小时添加监听器?
我现在有如何将监听器添加到分频器位置?
split.getDividers().get(0).positionProperty().addListener(new ChangeListener<Number>(){
public void changed(ObservableValue<? extends Number> observableValue, Number oldWindowWidth, Number newWindowWidth){
//code
}
});
检测只要窗口或分割尺寸发生变化,但我只需要知道什么时候分频器位置改变,当我用鼠标拖动它等。有没有办法做到这一点?任何帮助将不胜感激!
答
有没有干净的方法可以做到这一点,但它可能例如在SplitPane
上使用CSS lookup。
由于分隔符的CSS类别为split-pane-divider
,您可以从场景图中获取分隔符,而实际上它们是StackPane
实例。
在这些StackPane
上,您可以注册一个鼠标按下和一个鼠标释放事件侦听器,并更新一个类成员,此时指示分隔线“处于拖动中”。然后在位置属性侦听器中,您可以检查该类成员:如果它是真的,则表示该分隔符正在被鼠标移动,否则可以忽略该更改。
例子:
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
)。
这里的大图是什么?人们可以争辩说,每当窗口改变大小时,滑块也“移动”。为什么你只想知道拖动它的用户? –