JavaFX最大化节点子节点的大小

时间:2015-01-19 18:54:00

标签: layout javafx

我希望将方块添加到窗格中,并将这些方块最大化。

一个方格占据整个窗格。 两个方块分开了窗格。 三个方块全部用三分之一。

当它溢出时,它会转到下一行" row"并继续这个过程。

所有方块的大小应相同。

有没有办法使用标准版面或我应该修改哪些?

由于

1 个答案:

答案 0 :(得分:2)

这是我对这个问题的看法。我不认为它是一个很好的解决方案,但至少它可能有助于指出某些人可能建立的技术以获得更好的解决方案。基本上,该解决方案会覆盖layoutChildren()以重新计算首选切片大小,因为切片数量或可用空间更改。我不确定是否应该从layoutChildren中调用getWidth或getHeight(虽然它似乎在这种情况下有效)。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

import java.util.Random;

public class TilePaneSample extends Application {

    private static final Random random = new Random(42);

    @Override
    public void start(Stage stage) {
        TilePane tiles = createTiles();

        VBox layout = new VBox(
                createControls(tiles),
                tiles
        );
        VBox.setVgrow(tiles, Priority.ALWAYS);

        stage.setScene(new Scene(layout, 400, 300));
        stage.show();
    }

    private TilePane createTiles() {
        TilePane tiles = new TilePane() {
            @Override
            protected void layoutChildren() {
                if (getChildren().size() > 0) {
                    setPrefTileWidth(
                            Math.floor(
                                    Math.min(
                                        Math.max(
                                                Tile.MIN_SIZE,
                                                getWidth() / getChildren().size()
                                        ),
                                        getHeight()
                                    )
                            )
                    );
                    setPrefTileHeight(getPrefTileWidth());
                }

                super.layoutChildren();
            }
        };
        tiles.setStyle("-fx-background-color: papayawhip;");
        tiles.setPrefColumns(5);
        tiles.setPrefRows(5);

        tiles.getChildren().add(new Tile());

        return tiles;
    }

    private ToolBar createControls(TilePane tiles) {
        Button addTile = new Button("Add Tile");
        addTile.setOnAction(action -> tiles.getChildren().add(new Tile()));

        Button removeTiles = new Button("Remove Tiles");
        removeTiles.setOnAction(action -> tiles.getChildren().clear());

        ToolBar controls = new ToolBar(addTile, removeTiles);

        controls.setMinHeight(ToolBar.USE_PREF_SIZE);

        return controls;
    }

    private class Tile extends StackPane {
        public static final int MIN_SIZE = 100;

        public Tile() {
            setStyle(
                    "-fx-background-color: " +
                            "rgb(" + random.nextInt(256) + ", " +
                            + random.nextInt(256) + ", "
                            + random.nextInt(256) + ");"
            );

            setMinSize(MIN_SIZE, MIN_SIZE);
        }
    }

    public static void main(String[] args) { launch(args); }
}