2013-05-12 52 views
10

中Iは、次のコードによって呼び出されるダイアログウィンドウ有する(DialogControllerは、モーダルダイアログウィンドウを使用するためのヘルパークラスであり、それは主に、そのウィンドウでコントローラの参照を一緒にバンドル):JavaFXのIllegalAccessExceptionが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(); 
} 

FXMLLoader.load()メソッドの実行中に例外が発生することを確認しました。また、私のinitialize()メソッドのコードが実行される前にエラーが発生していると判断しました。私はload()から取得するスタックトレースのいくつかはここにある:

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 

私のクラスDCServRecEditorDialogControllerのサブクラスです。それはかなり通常の探し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 

     ... 
} 

私はダブル、トリプルもコントローラクラスのインスタンスフィールドを持っていなかったFXMLで名前のコントロールがなかったことを確認するチェックしました。 すべてのインスタンスフィールドには@FXMLというタグが付けられています。

FXMLのコントローラクラスの名前は、my javaファイルと同じで、適切に修飾されています。 initialize()が呼び出される前にエラーが発生していますので、initialize()とは思えませんが、@FXMLというタグが付いていることを確認しました。

私のコントローラクラスのスケルトンをコピーしてビルダー シーンから貼り付け...私は、私が行方不明になったコントロールがなかったことを確認してシーンビルダーからのもののブロックを戻ったとrepastedました

私のJavaファイルに。

エラーメッセージには、問題が発生しているメンバに関する詳細は表示されません。ただし、修飾子 ""が付いていると言います。 コントローラクラスに戻って、すべてのメンバーをデフォルトアクセスpublicで作成しましたが、まだエラーが発生します。
私のクラスのどこから問題が生じているのか分かりません。 ここで何がうまくいかないのか誰かが知っていますか?

答えて

21

さらに別の厄介な問題です。

私は誰かがこれまでにこれに跳躍しなかったことに驚いています。

問題は私のクラスDCServRecEditorにありました。クラスはdefaultアクセス許可で宣言されています。

JavaFXではコントローラクラスをpublicにする必要があります。

この状況でのJavaのエラー報告は自分自身には間違いがあり、誤解を招きます。スタックトレースは、Javaがクラスのメンバーにアクセスできないと不平を言うことを明らかに示しています。したがって、インスタンスフィールドとメソッドに焦点を当てます。 Javaは実際にアクセスできないクラスそのものであり、メンバーではないと不平を言うべきだった。

+0

スコット私は正しい答えとしてあなた自身の答えを記すことができるはずだと思います。 – jewelsea

+0

リマインダーありがとう。私は明日まで待たなければならないと言います。 – scottb

+1

同じエラーで、1つのTableView要素の@FXMLアノテーションが見つかりませんでした。 –

-6

すべての方法を宣言し、公開することをお勧めします。