2017-05-08 27 views
0

Ich möchte eine Anwendung mit einem Menü auf der linken Seite und der Ansicht auf der rechten Seite machen. Ich habe verschiedene fxml-Datei. 1 Haupt- und Mehrfachansicht für die Ansicht.Dynamisch hinzugefügt Ansicht passt nicht Pane

Im Moment lade ich andere Ansicht, aber die Ansicht auf rechts ist nicht seine Eltern.

Hauptansicht

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

Benutzerdefinierte Ansicht Last in Behälter

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

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

Ich möchte die richtige Ansicht auf den Container passen.

+0

Try 'fillWidth = "true" 'auf dem zweiten' ColumnConstraints'-Objekt in der Haupt-FXML-Datei. –

+0

Ich teste es, immer noch nicht funktioniert. –

+0

Ah, ich nehme an, dass der in der zweiten FXML-Datei definierte Rasterbereich die Spalte im Hauptgitterbereich füllt, aber die Tabelle füllt nicht den Rasterbereich in der zweiten FXML-Datei? Kannst du das 'TableView' einfach zur Wurzel der zweiten FXML-Datei machen? Oder vielleicht 'GridPane.fillWidth =" true "' zu 'TableView' (sowie die vorherige' fillWidth') hinzufügen. Sie scheinen hier einige unnötige Ebenen zu haben (speziell das zweite Gitterfenster). –

Antwort

1

Die Pane, die Sie für den Container für die rechte Seite des Bildschirms verwenden, führt kein Layout durch, sodass der Inhalt nicht den verfügbaren Platz ausfüllen kann (egal welche Einstellungen Sie verwenden).

Verwenden Sie ein BorderPane für den Behälter statt:

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

und dann in der Steuerung können Sie einfach die neuen Inhalte als Mittelpunkt jedes Mal eingestellt:

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

Danke, dass Arbeit! –

Verwandte Themen