2013-05-12 10 views
10

I ein Dialogfenster, die durch den folgenden Code aufgerufen wird (DialogController ist eine Hilfsklasse für modales Dialogfenster verwenden, es bündelt hauptsächlich eine Steuerungsreferenz mit seinem Fenster zusammen):JavaFX Illegal während FXML Last()

void handleServicesEdit(ActionEvent event) throws IOException { 

    DCServRecEditor sre = DialogController.<DCServRecEditor>loadFXML(
      CensusAssistant.RES_FXML_DIALOG_SERVEDIT, 
      CensusAssistant.RES_STRING_SERVEDIT, 
      this.getDialog()); 
    sre.setDialogMode(DB.DBEDIT_MODE_EDIT, 
         tbvService.getItems(), 
         tbvService.getSelectionModel().getSelectedIndex(), 
         m_encCal); 
    sre.showAndWait(); 

    sre.release(); 
    this.updateGUI(); 
} 

Ich habe bestätigt, dass ich eine Ausnahme während der FXMLLoader.load() Methode bekomme. Ich habe auch festgestellt, dass der Fehler auftritt, bevor Code in meiner initialize()-Methode eine Chance hat, auszuführen. Einige der Stack-Trace, die ich von load() bekommen, ist hier:

java.lang.IllegalAccessException: Class sun.reflect.misc.ReflectUtil 
    can not access a member of class org.kls.md.censusassistant.DCServRecEditor 
    with modifiers "" 
file:/D:/Documents/NetBeansProjects/CensusAssistant/dist/run1284250063/CensusAssistant.jar!/org/kls/md/censusassistant/fxml/GUIServRecEditor.fxml:13 
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:738) 
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:775) 
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:180) 
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:563) 
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2314) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2131) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028) 
    at org.kls.md.censusassistant.DialogController.loadFXML(DialogController.java:63) 
    at org.kls.md.censusassistant.DCMainEditor.handleServicesEdit(DCMainEditor.java:330) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

     ... 

Caused by: java.lang.IllegalAccessException: Class sun.reflect.misc.ReflectUtil 
    can not access a member of class org.kls.md.censusassistant.DCServRecEditor 
    with modifiers "" 
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95) 
    at java.lang.Class.newInstance0(Class.java:368) 
    at java.lang.Class.newInstance(Class.java:327) 
    at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:46) 
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:731) 
... 66 more 

Meine Klasse DCServRecEditor eine Unterklasse von DialogController ist. Es ist eine ziemlich normal aussehende FXML Controller-Klasse:

class DCServRecEditor extends DialogController { 

    private int m_dialogMode = DB.DBEDIT_MODE_ADD; 
    private int m_selServ = -1; 
    private GregorianCalendar m_cal = null; 


    @FXML // ResourceBundle that was given to the FXMLLoader 
    private ResourceBundle resources; 

    @FXML // URL location of the FXML file that was given to the FXMLLoader 
    private URL location; 

    @FXML // fx:id="ancMatchSelector" 
    private AnchorPane ancMatchSelector; // Value injected by FXMLLoader 

    @FXML // fx:id="ancServEditor" 
    private AnchorPane ancServEditor; // Value injected by FXMLLoader 

    @FXML // fx:id="ancServRecEditor" 
    private AnchorPane ancServRecEditor; // Value injected by FXMLLoader 

     ... 
} 

Ich habe doppelt und dreifach überprüft, um sicherzustellen, dass es in der FXML keine genannte Kontrolle war, die nicht auch eine Instanz Feld in der Controller-Klasse hatte . Alle Instanzfelder sind mit @FXML gekennzeichnet.

Der Name der Controller-Klasse in der FXML ist der gleiche wie meine Java-Datei und ist ordnungsgemäß qualifiziert. Der Fehler tritt auf, bevor initialize() aufgerufen wird, also glaube ich nicht, dass es irgendetwas mit initialize() ist, obwohl ich überprüft habe, um sicherzustellen, dass es auch mit @FXML getaggt ist.

Das Skelett für meine Controller-Klasse kopiert und von Szene Builder eingefügt wurde ... Ich habe wieder und repasted Blöcke von Sachen aus Scene Builder sicher sein gegangen, dass es keine Kontrolle war ich fehlte in meiner Java-Datei.

Die Fehlermeldung gibt mir keine Details über das Mitglied, mit dem es ein Problem hat, außer zu sagen, es hat Modifikatoren "". Ich ging zurück zu meiner Controller-Klasse und machte alle Mitglieder mit Standardzugriff public, und ich bekomme immer noch den Fehler.
Ich weiß nicht einmal, wo in meiner Klasse das Problem herkommt. Hat jemand irgendwelche Ideen, was hier schief läuft?

Antwort

21

Noch ein peinlich einfaches Problem.

Ich bin überrascht, dass jemand nicht auf dieses jetzt gesprungen ist.

Das Problem war in meiner Klasse DCServRecEditor. Beachten Sie, dass die Klasse mit der Zugriffsberechtigung default deklariert wurde.

JavaFX erfordert, dass Controller-Klassen public gemacht werden.

Um fair zu mir selbst zu sein, ist Javas Fehlerbericht in dieser Situation abscheulich und irreführend. Der Stack-Trace zeigt deutlich, dass Java sich darüber beschwert, dass es nicht möglich ist, auf ein Mitglied meiner Klasse zuzugreifen. Daher konzentriere ich mich auf meine Instanzfelder und -methoden. Java hätte sich wirklich darüber beschweren müssen, dass die Klasse selbst nicht darauf zugreifen konnte und nicht seine Mitglieder.

+0

Scott Ich denke, Sie sollten in der Lage sein, Ihre eigene Antwort als die richtige Antwort zu markieren. – jewelsea

+0

Danke für die Erinnerung.Es sagt, ich muss bis morgen warten. – scottb

+1

Mit dem gleichen Fehler verpasste ich eine @ FXML-Annotation eines TableView-Elements –

-6

Ich bevorzuge es, jede Methode zu deklarieren und öffentlich zu veröffentlichen.