1

ユーザーが複数のコンテナを開いて個別の情報を表示できる「ワークスペース」を作成しようとしています。これらは、移動可能でサイズ変更可能である必要があります (ScrollPane など)。

機能の大部分を正常に作成しましたが、実際に問題を引き起こしていることが 1 つあり、問題を特定できません。

次のクラスを作成しました。

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);
}

この方法で開くと、ペインのサイズを変更してドラッグできますが、アンカーペインである「ノード」の子は非表示になるのではなく、現在の位置にとどまります。

この問題を修正するために、FXML ファイルの ScrollPane で AnchorPane をラップしました。これにより、サイズ変更が可能になりました。予想どおり、境界外の部分は表示されず、スクロールバーが表示されましたが、ドラッグは停止しました。マウスのドラッグ イベントを追跡しようとしたとき、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 のイベント ハンドラーに制限はありますか? リッスンする必要がある別のイベントはありますか? ありがとう!!

4

1 に答える 1

2

問題は、ScrollPane が MouseDragged イベントをトラップしていたことです。

イベント フィルタを追加しましたが、すべて問題ありません...

    addEventFilter(MouseEvent.MOUSE_DRAGGED, event -> {
        if(isTopSelected){
            dragPaneToNewLocation(event);
        }else if(isResizingHeight) {
            handleResizeHeight(event);
        }else if(isResizingWidth) {
            handleResizeWidth(event);
        }
    });
于 2015-01-08T23:49:31.757 に答える