在JavaFX 8中创建一个可调整大小的可拖动窗格

时间:2015-01-08 18:04:53

标签: draggable javafx-8 pane

我正在尝试创建一个“工作区”,用户可以在其中打开多个容器来显示不同的信息。这些需要是可移动的和相当大的(例如ScrollPane)。

我已经成功创建了大部分功能 - 但是有一件事真的让我遇到问题,我无法弄清楚这个问题。

我创建了以下类:

public class WorkspaceMoveableSizeablePane extends Pane
    public WorkspaceMoveableSizeablePane(Node view) {
        getChildren().add(view);
        init();
    }
    private void init() {
        ...set up the event handlers....

我尝试通过在WorkspaceController中包装现有窗格来使用此窗格:

@FXML private openSampleWorkspaceNode() {
          FXMLLoader loader = new FXMLLoader();
    Parent node = loader.load(
    this.getClass().getResource("MyView.fxml").openStream());
    WorkspaceMoveableSizeablePane dn = new WorkspaceMoveableSizeablePane(node);
    pane.getChildren().add(dn);
}

当我以这种方式打开它时 - 我可以调整我的窗格并拖动它,但是“节点”上的子节点(它是一个锚定窗格)保持在当前位置而不是隐藏。

为了解决这个问题,我将AnchorPane包装在FXML文件的ScrollPane中。这允许调整大小发生 - 并且正如预期的那样,超出边界的部分不可见并且滚动条出现,但拖动停止。当我试图跟踪鼠标拖动事件时,除非我正在调整WorkspaceMoveableSizeablePane的大小,否则它实际上没有触发。

//Event Listener for MouseDragged
    onMouseDraggedProperty().set(event -> {
      System.out.println("You are in the Mouse Dragged Event");
        if(isTopSelected){
            dragPaneToNewLocation(event);
        }else if(isResizingHeight) {
            handleResizeHeight(event);
        }else if(isResizingWidth) {
            handleResizeWidth(event);
        }
    });

我将我的FXML还原为AnchorPane,并按如下方式更改了WorkspaceMoveableSizeablePane以查看是否有帮助:

public class WorkspaceMoveableSizeablePane extends ScrollPane
    public WorkspaceMoveableSizeablePane(Node view) {
        setContent(view);
        init();
    }
    private void init() {
        ...set up the event handlers....

之前调整大小的工作,但拖累没有。鼠标拖动事件从未被触发过。此外,我的滚动窗格是空白的,没有任何内容。

所以我对如何继续这种尝试感到茫然。

ScrollPane的事件处理程序是否有限制?我应该听一个不同的事件吗?谢谢!

1 个答案:

答案 0 :(得分:2)

问题是ScrollPane正在捕获MouseDragged事件。

添加了一个事件过滤器,一切都很好......

    addEventFilter(MouseEvent.MOUSE_DRAGGED, event -> {
        if(isTopSelected){
            dragPaneToNewLocation(event);
        }else if(isResizingHeight) {
            handleResizeHeight(event);
        }else if(isResizingWidth) {
            handleResizeWidth(event);
        }
    });