2017-05-08 31 views
0

左側のメニューと右側のビューでアプリケーションを作成したいと思います。私は別のfxmlファイルを持っています。 1つはメイン、もう1つはビューです。動的に追加されたビューは表示されません枠

今は別のビューを読み込みますが、右側のビューでは親が表示されません。

メインビュー

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

コンテナ内のカスタムビュー負荷

<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

コントローラ

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

コンテナに合うように適切な表示をしたい。

+0

は 'fillWidth =「true」を試してみてください'をメインFXMLファイルの2番目の' ColumnConstraints'オブジェクトに追加します。 –

+0

私はそれをテストしますが、まだ動作しません。 –

+0

ああ、2番目のFXMLファイルで定義されているグリッドペインがメイングリッドペインの列を満たしていますが、テーブルが2番目のFXMLファイルのグリッドペインを満たしていないと思いますか? 'TableView'を2番目のFXMLファイルのルートにすることはできますか?または、 'GridView.fillWidth =" true "を' TableView'(以前の 'fillWidth'と同様に)に追加してください。ここには不要なレイヤーがいくつかあるようです(特に2番目のグリッドペイン)。 –

答えて

1

ディスプレイの右側のコンテナに使用しているPaneはレイアウトを実行しないため、使用する設定にかかわらずコンテンツを空き領域にすることはできません。

代わりにコンテナのBorderPaneを使用してください:あなたは、単に中心として、新たなコンテンツを毎回設定することができ、コントローラで

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

、その後を:

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

} 
+0

ありがとうございました! –

関連する問題