java - 动态添加的 View 不适合 Pane

标签 java javafx

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

现在我加载了不同的 View ,但右侧的 View 不是他的父 View 。

主视图

    <GridPane
        xmlns="http://javafx.com/javafx/8.0.112"
        xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="controller.Controller">
  <columnConstraints>
    <ColumnConstraints percentWidth="30.0" />
    <ColumnConstraints percentWidth="70.0" />
  </columnConstraints>
  <rowConstraints>
    <RowConstraints />
  </rowConstraints>
   <children>
      <GridPane maxWidth="Infinity" GridPane.columnIndex="0" GridPane.rowIndex="0">
          <columnConstraints>
              <ColumnConstraints percentWidth="100.0" />
          </columnConstraints>
          <rowConstraints>
              <RowConstraints />
              <RowConstraints />
              <RowConstraints />
              <RowConstraints />
              <RowConstraints />
          </rowConstraints>
          <children>
              <Button fx:id="devices" maxWidth="Infinity" mnemonicParsing="false" text="Devices" GridPane.columnIndex="0" GridPane.rowIndex="0" />
              <Button fx:id="inventory" maxWidth="Infinity" mnemonicParsing="false" text="Inventory" GridPane.columnIndex="0" GridPane.rowIndex="1" />
          </children>
      </GridPane>
      <Pane
              fx:id="container"
              minWidth="Infinity"
              maxWidth="Infinity"
              GridPane.hgrow="ALWAYS"
              GridPane.vgrow="ALWAYS"
              GridPane.columnIndex="1"
              GridPane.columnSpan="1"
              GridPane.rowIndex="0">
      </Pane>
   </children>
</GridPane>

容器中的自定义 View 加载

<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>

当前表单 enter image description here

Controller

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

我想要正确的 View 来适合容器。

最佳答案

您用于显示器右侧容器的Pane不执行布局,因此它无法使内容填充可用空间(无论您使用什么设置)。

使用 BorderPane 作为容器:

  <BorderPane 
          fx:id="container"
          GridPane.hgrow="ALWAYS"
          GridPane.vgrow="ALWAYS"
          GridPane.columnIndex="1"
          GridPane.columnSpan="1"
          GridPane.rowIndex="0">
  </BorderPane>

然后在 Controller 中您可以简单地每次将新内容设置为中心:

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

}

关于java - 动态添加的 View 不适合 Pane ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43853808/

相关文章:

docker - Docker 上的 JavaFX - 初始化 QuantumRenderer : no suitable pipeline found 时出错

java - 将 Mysql 中的 enum ('YES' , 'NO' ) 列映射到 hibernate 中的 boolean 值

java - 使用条件变量阻止生产者消费者 Java 实现

Java servlet。登录后如何访问之前的网址

java - 非静态最终变量在 Java 中有用吗?

javafx - 如何在javafx中创建动态可调整大小的形状?

css - 如何在JavaFX Label上查找应用的字体?

java - 如何从 Java Swing/GUI 调用 JavaFXApplication?这可能吗?

java - 模型数据未传输到 jsp 页面

java - Docker OpenJDK-8 JavaFx