2013-05-12 32 views
10

Tôi có một cửa sổ hộp thoại được gọi bằng đoạn mã sau (DialogController là một lớp helper cho việc sử dụng cửa sổ hộp thoại modal, nó chủ yếu bó cùng một tài liệu tham khảo điều khiển với cửa sổ của nó):JavaFX IllegalAccessException trong tải 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(); 
} 

Tôi đã xác nhận rằng tôi nhận được ngoại lệ trong phương thức FXMLLoader.load(). Tôi cũng đã xác định rằng lỗi xảy ra trước khi bất kỳ mã nào trong phương thức initialize() của tôi có cơ hội chạy. Một số vết đống mà tôi nhận được từ load() là ở đây:

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 

Lớp học của tôi DCServRecEditor là một lớp con của DialogController. Đây là lớp điều khiển FXML khá bình thường:

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 

     ... 
} 

Tôi đã kiểm tra gấp đôi và ba để đảm bảo rằng không có điều khiển được đặt tên trong FXML cũng không có trường thể hiện trong lớp điều khiển . Tất cả các trường mẫu được gắn thẻ với @FXML.

Tên của lớp bộ điều khiển trong FXML giống với tệp java của tôi và đủ điều kiện. Lỗi xảy ra trước khi initialize() được gọi, vì vậy tôi không nghĩ rằng nó là bất cứ điều gì với initialize(), mặc dù tôi đã kiểm tra để đảm bảo nó cũng được gắn thẻ với @FXML.

Bộ xương cho lớp điều khiển của tôi đã được sao chép và dán từ Scene Builder ... Tôi đã đi lại và repasted khối thứ từ Scene Builder để chắc chắn rằng không có một điều khiển tôi nhớ da diết trong tệp java của tôi.

Thông báo lỗi cho tôi không có thông tin cụ thể về thành viên đang gặp sự cố, ngoài việc nói nó có công cụ sửa đổi "". Tôi quay trở lại lớp điều khiển của mình và thực hiện tất cả các thành viên với quyền truy cập mặc định public và tôi vẫn gặp lỗi.
Tôi thậm chí không biết nơi nào trong lớp của tôi vấn đề phát sinh. Bất cứ ai có bất kỳ ý tưởng về những gì đang xảy ra ở đây?

Trả lời

21

Tuy nhiên, một vấn đề đáng xấu hổ đơn giản khác.

Tôi rất ngạc nhiên khi một người nào đó không nhảy vào lúc này.

Sự cố nằm trong lớp học của tôi DCServRecEditor. Lưu ý rằng lớp được khai báo với quyền truy cập default.

JavaFX yêu cầu các lớp điều khiển phải được thực hiện public.

Để công bằng với bản thân mình, báo cáo lỗi của Java trong trường hợp này là đáng ngại và gây hiểu nhầm. Theo dõi ngăn xếp rõ ràng cho thấy Java đang phàn nàn về việc không thể truy cập vào một thành viên trong lớp của tôi, do đó tập trung vào các trường và phương thức của cá thể của tôi. Java thực sự cần phải phàn nàn rằng chính bản thân nó là lớp mà nó không thể truy cập và không phải là thành viên của nó.

+0

Scott Tôi nghĩ bạn có thể đánh dấu câu trả lời của chính mình làm câu trả lời đúng. – jewelsea

+0

Cảm ơn lời nhắc.Nó nói tôi phải chờ đến ngày mai. – scottb

+1

Bởi cùng một lỗi, tôi đã bỏ lỡ chú thích @FXML của một phần tử TableView –

-6

Tôi muốn khai báo mọi phương thức và được công khai.

Các vấn đề liên quan