3

JavaFX の ScrollPane に問題があるため、助けを求めます。

Group を scrollPane に追加し、ScrollPane を Scene に追加し、最後にそれを JFXPanel に入れました。これは、Swing アプリケーションで使用し、うまく機能しているためです。次に、グループにコンポーネントを追加しました (コンポーネントとは、ノードのアセンブリを意味します)長方形など...)。それはうまくいきますが、スクロールペインのレイアウトからコンポーネントを移動したい場合、コンポーネントの動きが制御不能になり、非常に速く動き始め、その理由がわかりません。コンポーネントの境界線がスクロールペイン レイアウトの境界線に触れるとすぐに問題が発生します。代わりに ScrollBar を使用しようとしましたが、ScrollPane がこれに最も適したオブジェクトのようです。

ビューを作成するために使用したコードがあります:

public void createView() {
    this.architectureJFXPanel = new JFXPanel();
    this.group = new Group();
    this.scrollPane = new ScrollPane();


    this.scrollPane.setContent(group);
    this.scrollPane.setOnKeyPressed(new KeyPressed());

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            Scene scene = new Scene(scrollPane, Color.WHITE);
            architectureJFXPanel.setScene(scene);
        }
   });
}

コンポーネントを使用するビューにgroup.getChildren.add()配置し、その後 JFXPanel を swing アプリケーションに配置します。

これが私がやろうとしていることの例です。図では、コンポーネントをレイアウトの外に移動しようとしていることがわかります。

ここに画像の説明を入力

したがって、誰かがすでにこの種の問題を抱えていて、私を助けることができれば、私は本当に素晴らしいです:) どこに問題があるのか​​ を理解するためにさらに情報が必要かどうか尋ねてください.

4

1 に答える 1

1

ScrollBarを使用したScrollPaneの回避策は次のとおりです。

public void setStyle() {
    // In my program, TextField controls were generate at run-time, so the prefer height is calculated based on number of controls       
    int preHeight = 1000;
    Group root = new Group();

    // This anchor pane contains all control.
    AnchorPane anchorPane = new AnchorPane();
    // TODO: Add control into this anchor pane
    // anchorPane.getChildren().addAll();

    final ScrollBar sc = new ScrollBar();
    root.getChildren().addAll(anchorPane, sc);

    // Set default size for scene to 800 x 600
    int sceneW = 800;
    int sceneH = 600;
    final Scene scene = new Scene(root, sceneW, sceneH);

    // Setting for the scroll bar
    sc.setLayoutX(scene.getWidth()- sc.getWidth()/2 - 1);
    sc.setMin(0);
    sc.setOrientation(Orientation.VERTICAL);
    sc.setPrefHeight(sceneH);
    sc.setMax(preHeight - sceneH);

    // In case prefer height is smaller than scene height then hide the scroll bar
    if(preHeight < sceneH) {
        sc.setVisible(false);
    }

    scene.setRoot(root);

    // Change the scroll bar and the anchor pane when user change scene's width
    scene.widthProperty().addListener(new ChangeListener<Number>() {

        @Override
        public void changed(ObservableValue<? extends Number> arg0,
                Number arg1, Number arg2) {
            sc.setLayoutX(arg2.doubleValue()- sc.getWidth()/2 - 1);
            anchorPane.setPrefWidth(arg2.doubleValue() - sc.getWidth());
        }
    });

    // Change the scroll bar and the anchor pane when user change scene's height
    scene.heightProperty().addListener(new ChangeListener<Number>() {

        @Override
        public void changed(ObservableValue<? extends Number> arg0,
                Number arg1, Number arg2) {
            sc.setMax(preHeight - arg2.doubleValue());
            if(arg2.doubleValue() >= preHeight) {
                sc.setVisible(false);
            }
            else {
                sc.setVisible(true);
            }
            sc.setPrefHeight(arg2.doubleValue());
            anchorPane.setPrefHeight(arg2.doubleValue());
        }
    });

    // Change the Y position of anchor pane when user scroll the scroll bar
    sc.valueProperty().addListener(new ChangeListener<Number>() {
        public void changed(ObservableValue<? extends Number> ov,
                Number old_val, Number new_val) {
            anchorPane.setLayoutY(-new_val.doubleValue());
        }
    });

    anchorPane.setPrefSize(scene.getWidth() - sc.getWidth(), scene.getHeight());
}   

このアプローチには1つの問題があります。それは、ユーザーがタブキーを使用して画面内のコントロール間を移動した場合、スクロールバーのY位置が対応する位置に変更されないことです。この問題は、アンカーペインでフォーカス可能なコントロールのフォーカスイベントを処理し、それに応じてスクロールバーのY位置を設定することで解決できます。

于 2012-08-01T09:43:17.427 に答える