2016-11-20 52 views
3

有没有办法在调整我的分割窗格大小时添加监听器?
我现在有如何将监听器添加到分频器位置?

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

检测只要窗口或分割尺寸发生变化,但我只需要知道什么时候分频器位置改变,当我用鼠标拖动它等。有没有办法做到这一点?任何帮助将不胜感激!

+0

这里的大图是什么?人们可以争辩说,每当窗口改变大小时,滑块也“移动”。为什么你只想知道拖动它的用户? –

回答

3

有没有干净的方法可以做到这一点,但它可能例如在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)。