2012-12-06 7 views
5

Je crée une application JavaFX en utilisant le JavaFX Scene Builder. L'interface a été créée dans Scene Builder et un fichier FXML (main.fxml) a été créé. Pour utiliser l'interface dans mon application, je dois charger le fichier FXML en utilisant le FXMLLoader, mais il y a un problème car la méthode load() retourne un objet, et pour construire une scène, j'ai besoin d'une instance de classe Parent.Comment utiliser FXMLLoader.load() - JavaFX 2

Voici une partie de ma MainClass. Le compilateur donne une erreur, car la page est pas de type parent:

Object page = FXMLLoader.load(MainWindowController.class.getResource("main.fxml")); 
Scene scene = new Scene(page); 
primaryStage.setScene(scene); 
primaryStage.show(); 

Que dois-je faire pour faire de cette compilation et fonctionner correctement?

Voici le fichier FXML (de main.fxml):

<?xml version="1.0" encoding="UTF-8"?> 
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml"> 
    <children> 
    <VBox prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <children> 
     <MenuBar minHeight="21.0" prefHeight="21.0" prefWidth="600.0"> 
      <menus> 
      <Menu mnemonicParsing="false" text="File"> 
       <items> 
       <MenuItem mnemonicParsing="false" text="Close" /> 
       </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Edit"> 
       <items> 
       <MenuItem mnemonicParsing="false" text="Delete" /> 
       </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Help"> 
       <items> 
       <MenuItem mnemonicParsing="false" text="About" /> 
       </items> 
      </Menu> 
      </menus> 
     </MenuBar> 
     <ToolBar minHeight="24.0"> 
      <items> 
      <Button fx:id="btFormat" mnemonicParsing="false" text="FORMAT" /> 
      <Button fx:id="btUnformat" mnemonicParsing="false" text="Unformat" /> 
      <Button fx:id="btAutoIndent" mnemonicParsing="false" text="Auto-indent" /> 
      <CheckBox fx:id="cbShowLineNumber" mnemonicParsing="false" text="Show line number" /> 
      </items> 
     </ToolBar> 
     <SplitPane dividerPositions="0.5" focusTraversable="true" orientation="VERTICAL" prefHeight="348.0" prefWidth="600.0"> 
      <items> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"> 
       <children> 
       <VBox prefHeight="170.0" prefWidth="598.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
        <children> 
        <Label text="INPUT - Paste your code here" /> 
        <TextArea fx:id="taInput" prefWidth="200.0" wrapText="true" /> 
        </children> 
       </VBox> 
       </children> 
      </AnchorPane> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"> 
       <children> 
       <VBox prefHeight="170.0" prefWidth="598.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
        <children> 
        <Label text="OUTPUT - The formatted code" /> 
        <TextArea fx:id="taOutput" prefWidth="200.0" wrapText="true" /> 
        </children> 
       </VBox> 
       </children> 
      </AnchorPane> 
      </items> 
     </SplitPane> 
     </children> 
    </VBox> 
    </children> 
</AnchorPane> 
+0

S'il vous plaît inclure votre source de 'FXML' dans votre question. – jewelsea

+0

Fichier FXML ajouté. – ceklock

Répondre

8

En raison de diverses entités admissibles à charger par FXML vous devez vous taper l'état prévu.

Parent page = FXMLLoader.<Parent>load(MainWindowController.class.getResource("main.fxml").toExternalForm()); 
+0

Merci pour votre réponse, c'est plus simple que je ne le pensais. Basé sur votre réponse je l'ai fait comme ceci et cela fonctionne également: Parent page = (parent) FXMLLoader.load ( MainWindowController.class.getResource ("main.fxml")); – ceklock

+4

Pour Java> = 7, la conversion n'est pas nécessaire. Utilisez simplement: FXMLLoader.load (...). L'inférence de type fera le reste. – miho

5

Essayez cette

Parent root= FXMLLoader.load(getClass().getResource("mention the path to your fxml file"); 

espoir que cela aiderait