gpt4 book ai didi

java - 如何将监听器添加到分隔符位置?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:53 24 4
gpt4 key购买 nike

有没有办法在我调整拆分 Pane 大小时添加监听器?
我现在有

split.getDividers().get(0).positionProperty().addListener(new ChangeListener<Number>(){
public void changed(ObservableValue<? extends Number> observableValue, Number oldWindowWidth, Number newWindowWidth){
//code
}
});

它检测窗口或分隔线大小何时更改,但我只需要知道分隔线位置何时更改,例如我用鼠标拖动它时。有没有办法做到这一点?任何帮助将不胜感激!

最佳答案

没有干净的方法可以做到这一点,但可以通过使用 CSS lookup 来实现。在 SplitPane 上。

由于分隔线的 CSS 类为 split-pane-divider您可以从场景图中获取分隔线,它们实际上是 StackPane 实例。

在这些 StackPane 上,您可以注册一个鼠标按下事件和一个鼠标释放事件监听器,并更新一个类成员,该类成员指示分隔符此刻“处于拖动状态”。然后在 position 属性监听器中可以检查这个类成员:如果为 true 则表示分隔线正在被鼠标移动,否则可以忽略变化。

示例:

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)。

关于java - 如何将监听器添加到分隔符位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40707295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com