如何解决如何在JavaFX中的SplitPane Divider上检测鼠标拖动事件
我正在JavaFx中使用SplitPane
来用分隔符分割两个节点。我正在寻找一种区分两种情况的方法。一种情况是分隔线响应屏幕宽度变化而移动,第二种情况是我使用鼠标将分隔线拖动到特定位置。使用鼠标拖动分隔线时,需要向分隔线添加一个侦听器。我该怎么办?
解决方法
您需要的是一种方法,用于知道何时分隔线位置的更改是窗口调整大小的结果。或更正式地说,场景调整大小。
您可以在场景进行布局时使用addPreLayoutPulseListener设置一个标志,然后在使用Platform.runLater调整大小事件处理结束时清除该标志。当该标志为true时,您可以假定SplitPane分隔线位置的任何更改是由于场景布局而不是由于用户操作引起的。
这是一个例子:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.BorderPane;
public class DividerListenerTest
extends Application {
private boolean windowResizing;
@Override
public void start(Stage stage) {
Label left = new Label("Left");
left.setMinSize(1,1);
left.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);
left.setPadding(new Insets(200));
Label right = new Label("Right");
right.setMinSize(1,1);
right.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE);
right.setPadding(new Insets(200));
SplitPane splitPane = new SplitPane(left,right);
splitPane.getDividers().get(0).positionProperty().addListener(
(o,oldPos,newPos) -> dividerResized(oldPos,newPos));
Scene scene = new Scene(new BorderPane(splitPane));
scene.addPreLayoutPulseListener(() -> {
windowResizing = true;
Platform.runLater(() -> {
windowResizing = false;
});
});
stage.setScene(scene);
stage.setTitle("Divider Listener Test");
stage.show();
}
private void dividerResized(Number oldPos,Number newPos) {
if (windowResizing) {
return;
}
System.out.println("User moved divider position to " + newPos);
}
public static class Main {
public static void main(String[] args) {
Application.launch(DividerListenerTest.class,args);
}
}
}
请注意,addPreLayoutPulseListener
是从JavaFX 9开始添加的,在较早的版本中不可用。
Java 8
对于较早版本的JavaFX,您可以通过覆盖Scene根目录的layoutChildren()方法来完成相同的操作:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.BorderPane;
public class DividerListenerTest
extends Application {
private boolean windowResizing;
@Override
public void start(Stage stage) {
Label left = new Label("Left");
left.setMinSize(1,newPos));
Scene scene = new Scene(new BorderPane(splitPane) {
@Override
protected void layoutChildren() {
windowResizing = true;
super.layoutChildren();
Platform.runLater(() -> {
windowResizing = false;
});
}
});
stage.setScene(scene);
stage.setTitle("Divider Listener Test");
stage.show();
}
private void dividerResized(Number oldPos,Number newPos) {
if (windowResizing) {
return;
}
System.out.println("User moved divider position to " + newPos);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。