2013-03-08 22 views
5

Denetleyicim var ve orada INBOX klasörünü e-posta sunucusundan almaya çalışıyorum. Her şeyi indirerek tamam. Bu veriyi (e-posta konusunu, tarihinden itibaren) TableView'e koyabilirim, ancak sadece bu verileri TableView'da ayarlamaktan sorumlu olan bir iş parçacığı beklediğimde. Kodu: i t.join kaldırdığınızdaJavaFX'de NullPointerException başlat yöntemi

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

() bu NullPointerException fırlatır.

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) 

Bu, on dört e-postada, otuz e-postada farklı konumda görünür. Bazı fikirlerin mi var?

p.s Bu indirme için sabırsızlanıyorum çünkü 20 saniye sürüyor. 50 e-posta ile - başlatma sırasında bunu yapmak zorundayım.

+0

Değişkenlerinizi, Sınıflarıyla aynı durumda isimlendirmeyin. –

+1

'Veri' başlatılmamış, başlatılamıyor. –

+0

Başladım (veriler başka bir dosyadadır) :) – user2150038

cevap

10

JavaFX Uygulama Konu dışında başka iş parçacığı aktif sahne grafiğinin bağlı olduğu şey üzerinde değişiklik yapmayın Sizin hata.

Temel Bilgiler

bu kuralın açıklaması için JavaFX Concurrency Tutorial ve ayrıca Usage of JavaFX Platform.runLater and access to UI from a different thread bakınız. Veri listesi olarak

bir TableView Eğer ObservableList değiştirmek gibi aktif sahne grafiğinde destek bir ObservableList, bu TableView değiştiren olaylar ziyade JavaFX Uygulama Konuya daha kullanıcı iplikle değiştirerek ateşler - Bu yarışı neden olur koşullar ve tutarsız program hataları.

, bu

Sorununuzu çözmek için Fix Platform.runLater içindeki veri öğesini güncelleme çağrısı sarmak için:

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

Platform.runLater sunulan run yöntemin içeriğini üzerinde yürütülür JavaFX Uygulama Konu.