java-如何将侦听器添加到分隔线位置?

每当我调整拆分窗格的大小时,是否可以添加监听器?
我目前有

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上,您可以注册一个按下的鼠标和一个鼠标释放事件侦听器,并更新一个类成员,该成员指示当前分隔线处于“拖动状态”.然后,在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已添加到场景图(附加到一个场景).

上一篇:java-为什么GraphicsContext使用带有双重参数的方法?


下一篇:java-如何将多个LineCharts放入一个场景/舞台?