2013-03-08 19 views
5

コントローラがあり、そこに電子メールサーバからINBOXフォルダを取得しようとしました。ダウンロードするとすべてが正常です。私はこのデータ(電子メールの件名、日付、from)をTableViewに入れることができますが、TableViewでこのデータを設定するスレッドを待っているときだけです。 コード:JavaFXでのNullPointerExceptionの初期化メソッド

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

私はt.joinを(削除)それがこのNullPointerExceptionがスローされます。

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) 

これは、14の電子メール、30の電子メールで異なる位置に表示されます。いくつかのアイデアがありますか?

p.s 20秒かかるため、このダウンロードを待つことはできません。 50通の電子メール - 私は初期化中にそれをしなければならない。

+0

変数に、そのクラスと同じ大文字小文字を使用しないでください。 –

+1

'data'は初期化されていません。初期化してください。 –

+0

私はそれを初期化しました(データは他のファイルにあります):) – user2150038

答えて

10

あなたのエラー

のJavaFXアプリケーションスレッド以外のスレッドからアクティブなシーングラフに接続されているものを変更しないでください。

背景情報

は、このルールの説明はJavaFX Concurrency TutorialともUsage of JavaFX Platform.runLater and access to UI from a different threadを参照してください。

データリストがアクティブシーングラフに表示されているObservableListであるため、ObservableListを変更すると、変更イベントがJavaFXアプリケーションスレッドではなくユーザースレッドから変更されたTableViewに送られます。条件と一貫性のないプログラムの失敗。 Platform.runLaterに提出run方法の内容は上で実行されている

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

:どのようにPlatform.runLater内のデータ項目を更新するための呼び出しをラップし、あなたの問題を解決するにはに

をそれを修正する

JavaFXアプリケーションスレッド。

関連する問題