2012-12-06 11 views
5

Buduję aplikację JavaFX przy użyciu JavaFX Scene Builder. Interfejs został utworzony w Scene Builder i utworzono plik FXML (main.fxml).Jak używać FXMLLoader.load() - JavaFX 2

Aby użyć interfejsu w mojej aplikacji, muszę załadować plik FXML przy użyciu FXMLLoader, ale jest problem, ponieważ metoda load() zwraca obiekt, a do zbudowania sceny potrzebuję instancji klasy nadrzędnej.

Poniżej znajduje się fragment mojej MainClass. Kompilator daje błąd, ponieważ strona nie jest typu nadrzędny:

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

Co mogę zrobić, aby to skompilować i uruchomić poprawnie?

Oto plik FXML (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

'Proszę podać swoje źródło FXML' w swoim pytaniu. – jewelsea

+0

Dodano plik FXML. – ceklock

Odpowiedz

8

Ze względu na różnorodność podmiotów uprawnionych do załadowania przez FXML trzeba oczekiwać stanie wpisać samemu.

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

Dzięki za odpowiedź, jest to prostsze niż myślałem. Na podstawie Twojej odpowiedzi zrobiłem to w ten sposób i działa również: Strona nadrzędna = (Rodzic) FXMLLoader.load ( MainWindowController.class.getResource ("main.fxml")); – ceklock

+4

Dla języka Java> = 7 rzutowanie nie jest konieczne. Po prostu użyj: FXMLLoader.load (...). Typ wnioskowania zrobi resztę. – miho

5

Spróbuj

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

nadzieję, że pomoże to