JavaFX:如何布局Group的子级以填充宽度和高度

时间:2016-08-09 19:42:57

标签: layout javafx

我试图弄清楚如何最大化Group中打包的节点的宽度和高度。我想打包到Group的主要原因是我希望在TranslateTransitiontreeView之后添加listView并返回。要做到这一点,我需要一个来回移动的虚拟节点,该节点必须具有绝对定位。

根据这个SO question,我需要使用Group,我想在下面的MWE中实现这个目标。

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.SplitPane;
import javafx.scene.control.ToolBar;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import static javafx.collections.FXCollections.observableArrayList;

public class MWE extends Application {

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

    public void start(Stage primaryStage) throws Exception {
        final VBox top = new VBox(new MenuBar(new Menu("File")), new ToolBar(new Button("button1")));
        final ToolBar bottom = new ToolBar(new Label("status"));
        final SplitPane main = new SplitPane(new SplitPane(createSplitPaneWithTreeView()), new VBox());
        //main.setPrefSize(1920,1080);
        final Group center = new Group(main);
        main.setDividerPositions(0.40, 0.60);
        BorderPane borderPane = new BorderPane(center, top, new Label(), bottom, null);
        show(primaryStage, borderPane);

    }

    private SplitPane createSplitPaneWithTreeView() {
        final TreeItem<String> root = new TreeItem<>("Foo");
        root.getChildren().addAll(new TreeItem<>("Item 1"), new TreeItem<>("Item 2"));
        final TreeView<String> treeView = new TreeView<>(root);
        SplitPane splitPane = new SplitPane(treeView, new ListView<>(observableArrayList("List item 1", "List item 2")));
        splitPane.setOrientation(Orientation.VERTICAL);
        return splitPane;
    }

    private void show(Stage primaryStage, Parent parent) {
        primaryStage.setScene(new Scene(parent, 1920, 1080));
        primaryStage.show();
    }

}

我希望基本上避免通过硬编码设置main的首选大小。我知道也可以将splitpane的widthProperty / heightProperty绑定到root,但还有其他优雅的解决方案吗?

1 个答案:

答案 0 :(得分:2)

如果您真的想要使用组,则无法设置或绑定主Splitpane的prefWidth / Height。毕竟,该集团将自己调整为其内容的优先级。我不明白为什么你觉得把你的主要与场景的宽度和高度绑在一起是不合适的:

primaryStage.setScene(new Scene(borderPane, 1920, 1080));
main.prefHeightProperty().bind(primaryStage.getScene().heightProperty());
main.prefWidthProperty().bind(primaryStage.getScene().widthProperty());
primaryStage.show();

它总会随着你的窗口调整大小,你想要的行为,但不是这样,为什么?