2013-05-12 12 views
10

Mam okno dialogowe, który jest wykonywany przez następujący kod (DialogController jest klasa pomocnika za korzystanie modalnych okien dialogowych, to głównie wiązki razem odniesienie kontrolera z okienkiem):JavaFX IllegalAccessException podczas obciążenia FXML()

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(); 
} 

Potwierdziłem, że otrzymałem wyjątek podczas metody FXMLLoader.load(). Stwierdziłem również, że błąd występuje, zanim dowolny kod w mojej metodzie initialize() ma szansę uruchomić. Niektóre ślad stosu, że dostanę od load() jest tutaj:

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 

Moja klasa DCServRecEditor jest podklasą DialogController. Jest to całkiem normalne klasy kontroler patrząc FXML:

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 

     ... 
} 

mam podwójne i potrójne sprawdzane, aby upewnić się, że nie był nazwany kontrola w FXML że nie ma również pole instancji w klasie kontrolera . Wszystkie pola instancji są oznaczone jako @FXML.

Nazwa klasy kontrolera w FXML jest taka sama jak mojego pliku java i jest odpowiednio kwalifikowana. Błąd występuje przed wywołaniem initialize(), więc nie sądzę, że jest to coś z initialize(), chociaż sprawdziłem, aby upewnić się, że jest on również oznaczony jako @FXML.

Szkielet dla mojej klasie kontrolera został skopiowany i wklejony z Scene Builder ... Poszedłem z powrotem i repasted bloki rzeczy z Scene Builder aby mieć pewność, że nie było sterowanie mi brakuje w moim pliku java.

Komunikat o błędzie nie podaje mi szczegółów dotyczących członka, z którym ma on problem, poza tym, że ma modyfikatory "". Wróciłem do klasy kontrolera i utworzyłem wszystkich członków z domyślnym dostępem public i wciąż dostaję błąd.
Nie wiem nawet, skąd w mojej klasie pochodzi ten problem. Ktoś ma jakieś pomysły na temat tego, co dzieje się tutaj?

Odpowiedz

21

Kolejny żenująco prosty problem.

Jestem zaskoczony, że ktoś już na to nie skoczył.

Problem był w mojej klasie DCServRecEditor. Zauważ, że klasa została zadeklarowana z uprawnieniem dostępu default.

JavaFX wymaga, aby klasy kontrolerów były wykonane public.

Aby być uczciwym wobec mnie, raportowanie błędów Java w tej sytuacji jest ohydne i wprowadzające w błąd. Śledzenie stosu wyraźnie pokazuje, że Java narzeka na brak możliwości uzyskania dostępu do członka mojej klasy, dlatego skupiam się na polach i metodach instancji. Java naprawdę powinna była narzekać, że to sama klasa nie może uzyskać dostępu, a nie jej członkowie.

+0

Scott Myślę, że powinieneś być w stanie oznaczyć własną odpowiedź jako poprawną odpowiedź. – jewelsea

+0

Dzięki za przypomnienie.Mówi, że muszę poczekać do jutra. – scottb

+1

Przez ten sam błąd pominięto adnotację @FXML jednego elementu TableView. –

-6

Wolę zadeklarować każdą metodę i podać do publicznej wiadomości.