2013-03-08 35 views
5

Tôi có bộ điều khiển và ở đó tôi cố gắng lấy thư mục INBOX từ máy chủ e-mail. Với việc tải xuống mọi thứ đều ổn. Tôi có thể đặt dữ liệu này (chủ đề email, từ, ngày) vào TableView nhưng ... chỉ khi tôi đang đợi thread chịu trách nhiệm thiết lập dữ liệu này trong TableView. Code:NullPointerException trong phương thức khởi tạo JavaFX

// The table and columns 
@FXML 
TableView<MainModel.Item> itemTbl; 
@FXML 
TableColumn itemNameCol; 
@FXML 
TableColumn itemQtyCol; 
@FXML 
TableColumn itemTitleCol; 
// The table's data 
static ObservableList<MainModel.Item> data; 

public void dataSet(){ 
    // Set up the table data 
    itemNameCol.setCellValueFactory(
     new PropertyValueFactory<MainModel.Item,String>("name") 
    ); 
    itemQtyCol.setCellValueFactory(
     new PropertyValueFactory<MainModel.Item,String>("qty") 
    ); 
    itemTitleCol.setCellValueFactory(
     new PropertyValueFactory<MainModel.Item,String>("title") 
    ); 

    data = FXCollections.observableArrayList(); 
    itemTbl.setItems(data); 
} 

public void setEnemyEvent() { 
    itemTbl.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      if (event.getClickCount() == 2) { 
       if(itemTbl.getSelectionModel().getSelectedItem()!=null){ 
        System.out.println(itemTbl.getSelectionModel().getSelectedItem().name); 
       } 
      } 
     } 
    }); 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    setEnemyEvent(); 
    dataSet(); 
    Thread t = new Thread(new MessageLoop()); 
    //HERE: 
    t.start(); 
    //of course normally here is try and catch 
    t.join(); 
} 

//staric nested class "for loop" 
private static class MessageLoop implements Runnable { 
    public void run() { 
     try { 
      EmailConnetion con = new EmailConnetion(); 
      MainModel MainModel = new MainModel(); 
      for(int i=0;i<con.message.length;i++){ 
       try{ 
        MainModel.Item item = MainModel.new Item(); 
        item.name.setValue(i+""+con.message[i].getFrom()[0].toString()); 
        item.qty.setValue(con.message[i].getSentDate().toString()); 
        item.title.setValue(con.message[i].getSubject().toString()); 
        //Here is a problem. 
        data.add(item);//This indicate my IDE 
        //***************** 
       } catch(AddressException e) { 
        System.out.println("Error : " + "AddressException:"+i); 
       } 
      } 
     } catch (NoSuchProviderException ex) { 
      Logger.getLogger(SimpleController.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (MessagingException ex) { 
      Logger.getLogger(SimpleController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

Khi tôi loại bỏ t.join() nó sẽ ném NullPointerException này.

Exception in thread "Thread-3" java.lang.NullPointerException 
    at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:291) 
    at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:48) 
    at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.callObservers(ReadOnlyUnbackedObservableList.java:74) 
    at javafx.scene.control.TableView$TableViewArrayListSelectionModel$3.onChanged(TableView.java:1725) 
    at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:134) 
    at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:48) 
    at com.sun.javafx.collections.ObservableListWrapper.callObservers(ObservableListWrapper.java:97) 
    at com.sun.javafx.collections.ObservableListWrapper.clear(ObservableListWrapper.java:184) 
    at javafx.scene.control.TableView$TableViewArrayListSelectionModel.quietClearSelection(TableView.java:2154) 
    at javafx.scene.control.TableView$TableViewArrayListSelectionModel.updateSelection(TableView.java:1902) 
    at javafx.scene.control.TableView$TableViewArrayListSelectionModel.access$2600(TableView.java:1681) 
    at javafx.scene.control.TableView$TableViewArrayListSelectionModel$8.onChanged(TableView.java:1802) 
    at com.sun.javafx.scene.control.WeakListChangeListener.onChanged(WeakListChangeListener.java:71) 
    at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:291) 
    at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:48) 
    at com.sun.javafx.collections.ObservableListWrapper.callObservers(ObservableListWrapper.java:97) 
    at com.sun.javafx.collections.ObservableListWrapper.add(ObservableListWrapper.java:154) 
    at com.sun.javafx.collections.ObservableListWrapper.add(ObservableListWrapper.java:144) 
    at javasplitpane.SimpleController$MessageLoop.run(SimpleController.java:95) 
    at java.lang.Thread.run(Thread.java:722) 

Điều này xuất hiện ở vị trí khác, trong mười bốn email, ba mươi email. Bạn có một số ý tưởng?

p.s Tôi không thể đợi quá trình tải xuống này vì mất 20 giây. với 50 email - tôi phải làm điều đó trong khi khởi tạo.

+0

Đừng đặt tên biến của bạn với cùng trường hợp với Lớp của chúng. –

+1

'Dữ liệu' không được khởi tạo, khởi tạo nó. –

+0

Tôi đã khởi tạo nó (dữ liệu nằm trong tệp khác) :) – user2150038

Trả lời

10

Lỗi của bạn

Không sửa đổi bất cứ điều gì mà được kết nối đến hiện trường đồ thị hoạt động từ bất kỳ thread khác với JavaFX Application Chủ đề.

Thông tin cơ

Xem JavaFX Concurrency Tutorial và cũng Usage of JavaFX Platform.runLater and access to UI from a different thread cho một lời giải thích của quy tắc này.

Vì danh sách dữ liệu của bạn là ObservableList được hiển thị trong biểu đồ cảnh hiện hoạt, khi bạn sửa đổi ObservableList, nó sẽ thay đổi sự kiện thành TableView sửa đổi nó từ chuỗi người dùng của bạn thay vì Chủ đề ứng dụng JavaFX. điều kiện và thất bại chương trình không phù hợp.

Làm thế nào để Fix it

Để khắc phục vấn đề của bạn, quấn gọi để cập nhật các mục dữ liệu bên trong Platform.runLater:

Platform.runLater(new Runnable() { 
    @Override public void run() { 
    data.add(item); 
    } 
}); 

Nội dung của run phương pháp nộp cho Platform.runLater được thực hiện trên Chủ đề ứng dụng JavaFX.

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