2016-04-27 9 views
0

Ich experimentiere FMXL mit NetBeans und Scene Builder auf einem Ubuntu 14.04-System.javafx.fxml.LoadException: Fehler beim Auflösen von onSelectionChanged (Registerkarte)

Ich habe eine sehr einfache App mit einem Formular, in dem es ein TabPane gibt, und dieses mit 2 Tabs. Neben der Auswahl der Standardregisterkarten gibt es keine weiteren Funktionen.

Wenn ich eine Methode einstelle, die auf eine Registerkartenauswahl reagiert, in Scene Builder reagiert, auf ein onSelectionChanged-Ereignis reagiert und eine Methode auf dem Controller hat, die sich auf die fxml-Datei bezieht, wird eine Ausnahme ausgelöst. Ohne den obigen Code funktioniert alles gut (das heißt kompiliert und ausgeführt wird). Der Fehler wird auf das Attribut des XML-Skripts verwiesen, das dort definiert ist.

Dieses Problem tritt bei NB8.1 + SC8.1.1 + JDK1.7 auf und ist auch bei JDK1.8 aufgetreten; auch mit NB8.0.2 + SC2.2.

Ist dies ein Fehler von mir oder ein Fehler irgendwo in den Tools?

Vielen Dank im Voraus.

Die Fehlermeldung:

Executing /home/pvc/projects/java-tests/JavaFX/JavaFXApplication12/dist/run1743546166/JavaFXApplication12.jar using platform /usr/jdk1.7.0_80/bin/java 
Exception in thread "main" java.lang.NoClassDefFoundError: javafx/application/Application 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482) 
Caused by: java.lang.ClassNotFoundException: javafx.application.Application 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 13 more 
Java Result: 1 

Der Code:

package javafxapplication12; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

/** 
* 
* @author pvc 
*/ 
public class JavaFXApplication12 extends Application 
{ 


    @Override 
    public void start(Stage stage) throws Exception 
    { 
     Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 

     Scene scene = new Scene(root); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) 
    { 
     launch(args); 
    } 

} 


package javafxapplication12; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Label; 
import javafx.scene.control.Tab; 

/** 
* 
* @author pvc 
*/ 
public class FXMLDocumentController implements Initializable 
{ 

    @FXML 
    private Tab tab1Id; 

    @FXML 
    void handleOnTabSelected(ActionEvent event) { 
     System.out.println("tab1 selected"); 
    }  

    @Override 
    public void initialize(URL url, ResourceBundle rb) 
    { 
     // TODO 
    }  

} 



<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Tab?> 
<?import javafx.scene.control.TabPane?> 
<?import javafx.scene.layout.AnchorPane?> 

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65" fx:controller="javafxapplication12.FXMLDocumentController"> 
    <children> 
     <TabPane layoutX="-15.0" layoutY="-55.0" prefHeight="200.0" prefWidth="320.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <tabs> 
      <Tab fx:id="tab1Id" closable="false" onSelectionChanged="#handleOnTab1Selected" text="tab1"> 
      <content> 
       <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
      </content> 
      </Tab> 
      <Tab text="Untitled Tab 2"> 
      <content> 
       <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
      </content> 
      </Tab> 
     </tabs> 
     </TabPane> 
    </children> 
</AnchorPane> 

Antwort

0

Sie einen Tippfehler haben, mit einem 1v in the clause OnSelectionChanged = "# handleOnTab1Selected" which does not match the declaration Leere handleOnTabSelected (Action Ereignis) `

Allerdings die Stack-Trace-Anzeige weist darauf hin, dass Ihr Projekt nicht ordnungsgemäß eingerichtet wurde und dass die Klasse javafx.application.Application nicht von der Laufzeitumgebung aufgelöst werden kann.

bekam ich meine selbst in Schwierigkeiten der onSelectionChanged-Klausel in der FXML verwenden, da diese Auswahl Ereignisse bereits gefeuert geändert werden, bevor die Methode initialize des Controllers abgeschlossen hat und damit die lokalen @FXML Membervariablen für die Verwendung nicht erreicht wurden noch bevölkerten im Handler-Code. Das ist ein Ärgernis.

Also ich Refrain verwenden Event-Handler-Klauseln in der FXML und stattdessen geeignete Listener in der Initialisierungsmethode des Controllers zu definieren.

Verwandte Themen