【问题标题】:JavaFX maximize the size of node childrenJavaFX 最大化节点子节点的大小
【发布时间】:2015-03-17 20:56:02
【问题描述】:

我想将正方形添加到窗格中,并将这些正方形最大化。

一个正方形占据整个窗格。 两个方块将窗格分开。 三个方格组成三分之二。

当它溢出时,它会转到下一个“行”并继续该过程。

所有的方块都应该是一样大的。

有没有办法使用标准布局或者我应该修改哪个?

谢谢

【问题讨论】:

  • 为什么会溢出?正方形是否有某种最小尺寸? (无论如何,我相信您正在寻找 TilePane)。
  • 正确。假设最小宽度为 200... TilePane 对我来说到目前为止缩小了节点,有没有办法避免像 prefTileWidth(-1) 这样的情况?我也会认为 TilePane 的工作方式与描述的方式相同。有没有一个标准的例子可以做我正在讨论的事情?
  • 我已经玩了一段时间了,它实际上并不简单......
  • 好吧,我认为我目前最好的解决方案是根据我拥有的瓷砖数量来更改 prefTileWidth 和 prefTileHeight .... 还不错,它并不优雅,但也不是很多到目前为止的代码。

标签: layout javafx


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多