15

次のコードによって呼び出されるダイアログ ウィンドウがあります (DialogControllerモーダル ダイアログ ウィンドウを使用するためのヘルパー クラスです。主に、コントローラー参照とそのウィンドウを一緒にバンドルします)。

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

私のクラスDCServRecEditorは のサブクラスですDialogController。これはごく普通に見える 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 内のコントローラ クラスの名前は、私の Java ファイルと同じで、適切に修飾されています。が呼び出される前にエラーが発生するので、 でタグ付けされていることも確認しましたが、 でinitialize()はないと思います。initialize()@FXML

私のコントローラー クラスのスケルトンは、Scene Builderからコピー アンド ペーストされました。Scene Builder のブロックに戻って貼り付け直して、Java ファイルに欠落しているコントロールがないことを確認しました。

エラーメッセージには、修飾子 "" があるということ以外に、問題が発生しているメンバーに関する詳細はありません。コントローラー クラスに戻り、すべてのメンバーをデフォルト アクセスpublicで作成しましたが、それでもエラーが発生します。
クラスのどこから問題が発生しているのかさえわかりません。ここで何がうまくいかないのか、誰にもアイデアがありますか?

4

2 に答える 2

37

恥ずかしいほど簡単な問題をもう 1 つ。

誰かが今までにこれに飛びつかなかったことに驚いています。

問題は私のクラスにありDCServRecEditorました。クラスはdefaultアクセス権付きで宣言されていることに注意してください。

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

私自身に公平を期すために、この状況での Java のエラー報告は忌まわしく、誤解を招くものです。スタック トレースは、Java がクラスのメンバーにアクセスできないことを訴えていることを明確に示しているため、インスタンス フィールドとメソッドに焦点を当てています。Javaは、アクセスできないのはクラス自体であり、そのメンバーではないことを本当に訴えるべきでした。

于 2013-05-12T17:14:22.657 に答える