1

JavaFX を使用してペイン内に含まれる長方形のグリッドを作成しようとしています。これらの四角形のサイズを自動的に変更して、ペインのサイズに基づいて使用可能なスペースを占有し、四角形の間に小さなギャップを設けたいと考えています。

現在使用しているコードは次のとおりです。 createVisual 関数が呼び出されて、ペインを含むグループが生成されます。

public class Visualizer extends NodePart {
    private VBox m_vbox;
    private AnchorPane m_pane;

    public static class ResizableRectanble extends javafx.scene.shape.Rectangle {
        public ResizableRectangle(double w, double h) {
            super(w,h);
        }
        @Override
        public boolean isResizable() {
            return true;
        }
        @Override
        public void resize(double width, double height) {
            setWidth(width);
            setHeight(height);
        }
    }

    @Override
    protected Group createVisual() {
        final Group group = new Group() {
            @Override
            public boolean isResizable() {
                return true;
            }
            @Override
            public void resize(double w, double h) {
                m_pane.setPrefSize(w,h);
            }
        };
        m_pane = new AnchorPane();
        m_pane.setStyle("-fx-background-color : lightcyan; -fx-border-color: silver; -fx-border-width: 3;");
        m_pane.setPrefSize(100, 100);
        m_pane.setMouseTransparent(false);

        m_vbox = new VBox(3.0);
        m_vbox.setFillWidth(true);
        m_vbox.setMouseTransparent(false);

        for(int i=0; i<16; i++) {
            HBox hbox = new HBox(3.0);
            hbox.setAlignment(Pos.CENTER);
            for(int j=0; j<4; j++) {
                Rectangle rect = new ResizableRectangle(50.0,50.0);
                rect.setStyle("-fx-fill: lime; -fx-border-color: red; -fx-border-width: 3;");
                hbox.setHgrow(rect, Priority.ALWAYS);
                hbox.getChildren().add(rect);   
                hbox.setFillHeight(true);
            }
        }
        m_vbox.setVGrow(hbox, Priority.ALWAYS); 
        m_pane.setTopAnchor(m_vbox, 5.0);
        m_pane.setBottomAnchor(m_vbox, 5.0);
        m_pane.getChildren().add(m_vbox);
        group.getChildren().add(m_pane);
        return group;
    }
}

グループサイズが変更されたときに長方形の幅が初期値から変更されないため、これは実際には機能しません。長方形の高さも非常に小さく、それらの間は 3.0 ピクセルをはるかに超えています。

また、m_vbox に左右のアンカーを設定しようとしましたが、四角形がペインのサイズの半分未満にサイズ変更されるため、機能しないようです。

列と行にGridPaneと制約を使用しようとしましたが、重複があるため機能しません。可能であれば、VBox と HBox の組み合わせを使用したいと思います。

この関数は、グラフにノードを作成するために Eclipse GEF (Graphical Editing Framework) によって呼び出されます。Eclipse Neon で GEF バージョン 5 を使用しています。

私は JavaFX の初心者です。

編集、GridPane を使用して試したコード:

public class Visualizer extends NodePart {
    private GridPane m_gridPane;

    public static class ResizableRectanble extends javafx.scene.shape.Rectangle {
        public ResizableRectangle(double w, double h) {
            super(w,h);
        }
        @Override
        public boolean isResizable() {
            return true;
        }
        @Override
        public void resize(double width, double height) {
            setWidth(width);
            setHeight(height);
        }
    }

    @Override
    protected Group createVisual() {
        final Group group = new Group() {
            @Override
            public boolean isResizable() {
                return true;
            }
            @Override
            public void resize(double w, double h) {
                m_gridPane.setPrefSize(w,h);
            }
        };
        m_gridPane = new GridPane();
        m_gridPane.setStyle("-fx-background-color : lightcyan; -fx-border-color: silver; -fx-border-width: 3;");
        m_gridPane.setPrefSize(100, 100);
        m_gridPane.setMouseTransparent(false);

        for(int i=0; i<16; i++) {
            for(int j=0; j<4; j++) {
                if(i == 0) {
                    ColumnConstraints cc = new ColumnConstraints();
                    cc.setFillWidth(true);
                    cc.setHgrow(Priority.ALWAYS);
                    m_gridPane.getColumnConstraints().add(cc);
                }

                Rectangle rect = new ResizableRectangle(50.0,50.0);
                rect.setStyle("-fx-fill: lime; -fx-border-color: red; -fx-border-width: 3;");
                m_gridPane.add(rect, j, i);
            }
            RowConstraints rc = new RowConstraints();
            rc.setFillHeight(true);
            rc.setVgrow(Priority.ALWAYS);
            m_gridPane.getRowConstraints().add(rc);
        }
        group.getChildren().add(m_gridPane);
        return group;
    }
}

編集 2: GridPane を使用するコードが機能し、ノードが重複していません。ただし、長方形の境界が表示されていないため、重なりがあると思いました。

4

0 に答える 0