2016-09-02 17 views
4

Ich baue eine GUI mit Szenen-Generator, und die Mehrheit meiner Szenen haben ein Element gemeinsam (ein iOS-Typ-Home-Taste am unteren Rand). Ich frage mich, ob es möglich war, diese Komponente in einer separaten fxml-Datei zu definieren. Aus den von mir durchgeführten Untersuchungen gibt es einen ähnlichen Prozess für die Deklaration einer wiederverwendbaren Komponente, aber nur innerhalb derselben fxml-Datei. Wie könnte ich dieses Prinzip für mehrere fxml-Dateien anwenden?JavaFX - Wiederverwendbare FXML-Komponente

+3

Wie wäre es mit einem BorderPane? Die Schaltfläche wird am unteren Rand und Sie ändern nur die Mitte mit Ihren fxml-Dateien. – GOXR3PLUS

+0

Einfach und effektiv! Danke, ich habe nicht darüber nachgedacht. –

Antwort

0

Dies kann man auf jeden Fall erreichen, indem man eine separate FXML-Datei erstellt und ihr einen Knoten mit einer eindeutigen ID hinzufügt und dann über die ID auf diesen Knoten zugreift. Der schwierige Teil ist, wie man es anwendungsweit macht. wahrscheinlich die gleiche Funktion in vielen Ihrer Controller, aber hier ist, wie Sie eine a-Taste aus einer FXML-Datei erhalten würde.

Alle Tasten führen die gleiche Aktion aus?

Parent root = FXMLLoader.load(getClass().getResource("fileName.fxml")); 

     ObservableList<Node> nodes = root.getChildrenUnmodifiable(); 
     String _id = "testButton"; 
     for (Node node : nodes) { 
      if (node.getId().equals(_id)) { 
       return node; 
      } 

     } 
     return null; 
} 
2

Sie können wie folgt tun:

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.example.MainController"> 
<children> 
<fx:include fx:id="someId" source="NestedFXML.fxml"/> 
</children> 

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.example.NestedFXMLController"> 
</AnchorPane> 

Controller-Klassen:

public class MainController implements Initializable { 

    @FXML 
    private NestedFXMLController someIdController; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
    // TODO Auto-generated method stub 

    } 
} 
public class NestedFXMLController implements Initializable { 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
    // TODO Auto-generated method stub 

    } 
} 

Nizza: Die verschachtelte Controller kann über FXML Anmerkung injiziert werden. Der Feldname muss mit der fx: id attribute string + "Controller" übereinstimmen!