Java 动态添加的视图不适合窗格

Java 动态添加的视图不适合窗格,java,javafx,Java,Javafx,我想制作一个左边有菜单,右边有视图的应用程序。我有不同的fxml文件。1个主视图和多个视图 现在我加载了不同的视图,但右侧的视图不支持他的父视图 主视图 容器中的自定义视图加载 当前形式 控制器 我想要右视图以适应容器。您用于显示器右侧容器的窗格不进行布局,因此无论您使用何种设置,它都无法使内容填满可用空间 将边框窗格改为容器: 然后在控制器中,您只需每次将新内容设置为中心: public class Controller implements Initializable { @FXML

我想制作一个左边有菜单,右边有视图的应用程序。我有不同的fxml文件。1个主视图和多个视图

现在我加载了不同的视图,但右侧的视图不支持他的父视图

主视图

容器中的自定义视图加载

当前形式

控制器

我想要右视图以适应容器。

您用于显示器右侧容器的窗格不进行布局,因此无论您使用何种设置,它都无法使内容填满可用空间

将边框窗格改为容器:

然后在控制器中,您只需每次将新内容设置为中心:

public class Controller implements Initializable {
    @FXML private BorderPane container;

    // ...

    public void load(Views view){
        if (views.containsKey(view)) {
            Node newView = views.get(view);
            container.setCenter(newView);

        } else {
            System.out.println("Error: key not found in map");
        }
    }

}

在主FXML文件中的第二个ColumnConstraints对象上尝试fillWidth=true。我测试了它,仍然不工作。啊,我猜第二个FXML文件中定义的网格窗格正在填充主网格窗格中的列,但表没有填充第二个FXML文件中的网格窗格?您可以将TableView作为第二个FXML文件的根吗?或者将GridPane.fillWidth=true添加到TableView以及上一个fillWidth。这里似乎有一些不必要的层,特别是第二个网格窗格。仍然没有,我将用屏幕截图更新。哦,你甚至还有另一个层。您的TableView位于GridPane内,GridPane内,GridPane内。除了最顶部的网格窗格之外,每个容器只有一个子容器,因此它是冗余的。特别是,由于窗格不执行布局,它无法使包含TableView的GridPane增长。您应该消除一些冗余层,尤其是窗格。至少在看不到主控制器的情况下,要演示如何操作并不容易。
<GridPane
        xmlns="http://javafx.com/javafx/8.0.112"
        xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="controller.DevicesController"
        GridPane.hgrow="ALWAYS"
        GridPane.vgrow="ALWAYS">

    <children>
        <TableView
                GridPane.columnIndex="0"
                GridPane.columnSpan="1"
                GridPane.hgrow="ALWAYS"
                GridPane.vgrow="ALWAYS"
                GridPane.rowIndex="0">
            <columns>
                <TableColumn text="Devices" />
                <TableColumn text="C2" />
            </columns>
        </TableView>
    </children>
</GridPane>
public class Controller implements Initializable {
    @FXML private Pane container;
    @FXML private Button devices;
    @FXML private Button inventory;

    private HashMap<Views, Node> views;

    private enum Views {
        DEVICES,
        INVENTORY
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        try {
            views = new HashMap<>();

            views.put(Views.DEVICES, FXMLLoader.load(getClass().getResource("../view/" + "view-devices.fxml")));
            views.put(Views.INVENTORY, FXMLLoader.load(getClass().getResource("../view/" + "view-inventory.fxml")));

            devices.setOnMouseClicked(v -> load(Views.DEVICES));
            inventory.setOnMouseClicked(v -> load(Views.INVENTORY));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void load(Views view){
        if (views.containsKey(view)) {
            Node newView = views.get(view);

            if (!container.getChildren().contains(newView)) {
                container.getChildren().add(newView);
            } else {
                newView.resize(container.getMaxWidth(), container.getMaxHeight());
                newView.toFront();
            }
        } else {
            System.out.println("Error: key not found in map");
        }
    }
}
public class Controller implements Initializable {
    @FXML private BorderPane container;

    // ...

    public void load(Views view){
        if (views.containsKey(view)) {
            Node newView = views.get(view);
            container.setCenter(newView);

        } else {
            System.out.println("Error: key not found in map");
        }
    }

}