如何将监听器添加到分隔位置?
Posted
技术标签:
【中文标题】如何将监听器添加到分隔位置?【英文标题】:How to add listener to divider position? 【发布时间】:2017-04-04 02:06:52 【问题描述】:有没有办法在我调整拆分窗格大小时添加侦听器? 我目前有
split.getDividers().get(0).positionProperty().addListener(new ChangeListener<Number>()
public void changed(ObservableValue<? extends Number> observableValue, Number oldWindowWidth, Number newWindowWidth)
//code
);
它检测窗口或分隔线大小何时更改,但我只需要知道分隔线位置何时更改,就像我用鼠标拖动它时一样。有没有办法做到这一点?任何帮助将不胜感激!
【问题讨论】:
这里的大局是什么?有人可能会争辩说,每当窗口改变大小时,滑块也会“移动”。为什么只想知道用户拖动它? 【参考方案1】:没有干净的方法可以做到这一点,但可以通过例如在SplitPane
上使用CSS lookup。
由于分隔线具有 split-pane-divider
的 CSS 类,您可以从场景图中获取分隔线,它们实际上是 StackPane
实例。
在这些StackPane
上,您可以注册一个鼠标按下和一个鼠标释放事件侦听器,并更新一个类成员,该成员指示该分隔符目前处于“拖动状态”。然后在 position 属性监听器中可以查看这个类成员:如果为真则表示分隔线正在被鼠标移动,否则可以忽略更改。
示例:
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
)。
【讨论】:
以上是关于如何将监听器添加到分隔位置?的主要内容,如果未能解决你的问题,请参考以下文章