2017-01-17 1 views
0

J'ai enregistré en Ukraine, donc désolé pour les erreurs. Je veux définir une base pour le fichier FXML Tabpane mais une exception vient quand je le fais:Je ne peux pas lire Tabpane en utilisant FXML Loader

public Stage stage; 
private Scene scene; 
public void start(Stage stage) { 
    try { 
     q=(TabPane)FXMLLoader.load(Main.class.getResource("test.fxml")); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    scene=new Scene(q,640,480); 
    stage.setScene(scene); 
    stage.show(); 
} 

Mais quand je veux définir une base pour le programme AnchorPane, il n'y a pas d'erreur lors de l'écriture:

public void start(Stage stage) { 
    try { 
     pane=(AnchorPane)FXMLLoader.load(Main.class.getResource("test.fxml")); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    scene=new Scene(pane,640,480); 
    stage.setScene(scene); 
    stage.show(); 
} 

fichier FXML ici https://drive.google.com/open?id=0B5LBeiES5-shWDFLRnBPZUhhdmM

extrait

du fichier FXML:

<TabPane fx:id="q" prefHeight="480.0" prefWidth="640.0" tabClosingPolicy="UNAVAILABLE" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1"> 
    <tabs> 
     <Tab fx:id="q0"> 
     <content> 
      <BorderPane prefHeight="546.0" prefWidth="752.0"> 
       <top> 
        <MenuBar prefHeight="25.0" prefWidth="432.0" BorderPane.alignment="CENTER"> 
        <menus> 
         <Menu mnemonicParsing="false" text="File"> 
          <items> 
           <MenuItem mnemonicParsing="false" onAction="#exitfile" text="Close" /> 
          </items> 
         </Menu> 
         <Menu mnemonicParsing="false" text="Options"> 
          <items> 
           <Menu mnemonicParsing="false" text="Language"> 
           <items> 
            <RadioMenuItem mnemonicParsing="false" text="EN" /> 
            <RadioMenuItem mnemonicParsing="false" text="UA" /> 
           </items> 
           </Menu> 
           <MenuItem mnemonicParsing="false" text="Others" /> 
          </items> 
         </Menu> 
         <Menu mnemonicParsing="false" text="Help"> 
          <items> 
           <MenuItem mnemonicParsing="false" text="About" /> 
          </items> 
        </Menu> 
        </menus> 
        </MenuBar> 
       </top> 
       <center> 
        <Pane prefHeight="501.0" prefWidth="735.0" BorderPane.alignment="CENTER"> 
        <children> 
         <ImageView fitHeight="520.0" fitWidth="640.0" pickOnBounds="true" preserveRatio="true"> 
          <image> 
           <Image url="@../../../../Test/res/fon.jpg" /> 
          </image> 
         </ImageView> 
         <GridPane layoutX="216.0" layoutY="145.0" prefHeight="98.0" prefWidth="248.0"> 
          <columnConstraints> 
           <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
          </columnConstraints> 
          <rowConstraints> 
           <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
           <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
           <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
           <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />  
          </rowConstraints> 
          <children> 
           <Button fx:id="b1" disable="true" mnemonicParsing="false" onAction="#enblean" prefHeight="85.0" prefWidth="248.0" text="Розпочати тест" GridPane.rowIndex="3" /> 
          <Label alignment="CENTER" prefHeight="45.0" prefWidth="243.0" text="Введіть ім'я та прізвище"> 
           <font> 
            <Font name="Lucida Fax Regular" size="14.0" /> 
           </font> 
           </Label> 
           <TextField fx:id="im" onAction="#b1dis"  onKeyPressed="#b1dis" onKeyReleased="#b1dis" onKeyTyped="#b1dis" prefHeight="29.0" prefWidth="248.0" GridPane.rowIndex="1" /> 
          </children> 
         </GridPane> 
        </children> 
        </Pane> 
       </center> 
      </BorderPane> 
     </content> 
     </Tab>  

extrémité de passage du fichier FXML

</children> 
         </Pane> 
        </center> 
        </BorderPane> 
       </children> 
      </AnchorPane> 
     </content> 
     </Tab> 
    </tabs> 
</TabPane> 

exeption:

javafx.fxml.LoadException: No controller specified. 
/C:/Users/Admin/workspace/Testp/bin/ua/NazarRepyanskiy/test.fxml:34 
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2597) 
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:103) 
at javafx.fxml.FXMLLoader$Element.getControllerMethodHandle(FXMLLoader.java:557) 
at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(FXMLLoader.java:599) 
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:770) 
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2532) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) 
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) 
at ua.NazarRepyanskiy.Main.start(Main.java:236) 
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Unknown Source) 
Exception in Application start method 
java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) 
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source) 
Caused by: java.lang.RuntimeException: Exception in Application start method 
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NullPointerException: Root cannot be null 
at javafx.scene.Scene.<init>(Scene.java:336) 
at javafx.scene.Scene.<init>(Scene.java:223) 
at ua.NazarRepyanskiy.Main.start(Main.java:240) 
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
... 1 more 
Exception running application ua.NazarRepyanskiy.Main 
+1

Pourriez-vous s'il vous plaît montrer l'erreur que vous obtenez? – JETM

+0

Aussi, [edit] la question d'inclure le fichier FXML, au lieu de poster un lien vers celui-ci (ainsi que d'inclure la trace de la pile). Vous pouvez trouver [instructions de formatage] (http://meta.stackoverflow.com/questions/251361/how-do-i-format-my-code-blocks) si vous en avez besoin. –

+0

Le fichier FXML est très grand environ 500 lignes donc je ne peux pas le mettre ici –

Répondre

0

Vous ne pouvez pas utiliser l'attribut onAction avec une valeur de #exitfile ou d'autres valeurs commençant par #, sauf si vous spécifiez un contrôleur soit à l'aide l'attribut fx:controller dans l'élément racine du fichier fxml

<TabPane fx:controller="mypackage.ControllerClass" 
     fx:id="q" prefHeight="480.0" prefWidth="640.0" tabClosingPolicy="UNAVAILABLE" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1"> 

ou en spécifiant une instance de contrôleur à l'aide FXMLLoader.setController sur une instance de contrôleur que vous utilisez pour charger le fichier FXML:

FXMLLoader loader = new FXMLLoader(Main.class.getResource("test.fxml")); 
loader.setController(controllerInstance); 
q=(TabPane)loader.load(); 

(l'attribut fx:controller ne doit pas être spécifié dans le fichier FXML pour cette approche du travail)


BTW: vous ne devriez pas essayer de continuer après avoir obtenu une exception dont vous ne pouvez pas récupérer. Dans ce cas, cela conduit à 2 stacktraces être imprimés: une pour l'exception lors du chargement du fichier FXML et qui vous avertit que vous ne pouvez pas continuer et utiliser q comme racine d'un Scene après

q=(TabPane)FXMLLoader.load(Main.class.getResource("test.fxml")); 

n'a pas affecté non - null valeur à q. Une meilleure idée serait de lancer une exception avec l'exception originale en tant que root ou simplement d'ajouter une clause throws à la méthode start.

try { 
    ... 
} catch(Exception e) { 
    throw new IllegalStateException(e); 
} 
+0

controller = "ua.NazarRepyanskiy.Main" ou controller = "ua.NazarRepyanskiy.Main.java"? –

+0

@ НазарРеп'янський Vous devez utiliser le nom de classe entièrement qualifié de la classe de contrôleur qui inclut seulement le nom du paquet et le nom de la classe mais pas '.java' (sauf si le nom de la classe est' java'). BTW: Le plus souvent, c'est une meilleure idée d'utiliser une classe différente de la classe d'application en tant que classe de contrôleur. – fabian

+0

loader.setController (controllerInstance); Je dois écrire ici à la place de controllerInstance? –