Создайте большую перетаскиваемую панель в JavaFX 8

Я пытаюсь создать «рабочее пространство», в котором пользователи могут открывать несколько контейнеров для отображения отдельной информации. Они должны быть подвижными и иметь большие размеры (например, 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 в ScrollPane в файле FXML. Это позволило изменить размер - и, как и ожидалось, части за пределами не были видны, а полосы прокрутки появились, однако перетаскивание прекратилось. Когда я попытался отследить событие перетаскивания мышью, оно на самом деле не срабатывало, если только я не изменял размер 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? Есть ли другое событие, которое я должен слушать? Спасибо!!


person purring pigeon    schedule 08.01.2015    source источник


Ответы (1)


Проблема заключалась в том, что ScrollPane перехватывала событие MouseDragged.

Добавил фильтр событий и все хорошо...

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