2013-03-08 33 views
5

Mam kontroler i tam próbuję uzyskać folder INBOX z serwera e-mail. Po pobraniu wszystko jest w porządku. Mogę umieścić te dane (temat wiadomości e-mail, od, daty) w TableView, ale ... tylko wtedy, gdy czekam na wątek odpowiedzialny za ustawienie tych danych w TableView. Kod:Wyjątek NullPointerException w JavaFX methodize

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

Kiedy usunąć t.join() będzie ona rzucać tego 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) 

ten pojawia się w innej pozycji, w czternastu email trzydzieści email. Masz jakieś pomysły?

p.s Nie mogę się doczekać tego pobrania, ponieważ trwa to 20 sekund. z 50 wiadomościami e-mail - muszę to zrobić podczas inicjowania.

+0

Nie określaj swoich zmiennych w tym samym przypadku, co ich Klasa. –

+1

"Dane", które nie zostało zainicjowane, zainicjuj je. –

+0

Zainicjowałem go (dane są w innym pliku) :) – user2150038

Odpowiedz

10

swój błąd

Nie wszystko, który jest podłączony do aktywnego wykresu sceny z dowolnego innego wątku niż nitka JavaFX aplikacji zmodyfikować.

Informacja Tło

Zobacz JavaFX Concurrency TutorialUsage of JavaFX Platform.runLater and access to UI from a different thread a także o wyjaśnienie tej reguły.

W liście danych jest ObservableList Postawienie TableView wyświetlane w aktywnym wykresie sceny, jak zmodyfikować ObservableList, pożary zmiana zdarzenia do Tableview modyfikując go z gwintem użytkownika zamiast gwintu JavaFX aplikacji - to powoduje wyścig warunki i niespójne awarie programu.

Jak naprawić to

Aby rozwiązać problem, zawinąć wywołanie zaktualizować element danych wewnątrz Platform.runLater:

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

zawartość metody run przedłożonego Platform.runLater są realizowane na Wątek aplikacji JavaFX.

Powiązane problemy