2013-03-08 7 views
5

प्रारंभ करने के लिए मेरे पास नियंत्रक है और वहां मैं ई-मेल सर्वर से INBOX फ़ोल्डर प्राप्त करने का प्रयास कर रहा हूं। सबकुछ डाउनलोड करने के साथ ठीक है। मैं इस डेटा (ईमेल विषय, तिथि से) को तालिका दृश्य में डाल सकता हूं लेकिन ... केवल तभी जब मैं तालिका दृश्य में इस डेटा को सेट करने के लिए जिम्मेदार थ्रेड की प्रतीक्षा कर रहा हूं। कोड: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) 

यह चौदह ईमेल, तीस ईमेल में अलग-अलग स्थिति में दिखाई देता है। आपके पास कुछ विचार हैं?

p.s मैं इस डाउनलोडिंग के लिए इंतजार नहीं कर सकता क्योंकि इसमें 20 सेकंड लगते हैं। 50 ईमेल के साथ - मुझे इसे आरंभ करने के दौरान करना है।

+0

अपनी कक्षा के समान स्थिति के साथ अपने चर नाम न दें। –

+1

'डेटा' इसे प्रारंभ नहीं किया गया है, इसे आरंभ करें। –

+0

मैंने इसे शुरू किया है (डेटा अन्य फाइल में है) :) – user2150038

उत्तर

10

आपका त्रुटि

जो कुछ भी JavaFX आवेदन थ्रेड के अलावा कोई अन्य धागे से सक्रिय दृश्य ग्राफ से जुड़ा है को संशोधित न करें।

पृष्ठभूमि जानकारी

इस नियम के लिए स्पष्टीकरण JavaFX Concurrency Tutorial और भी Usage of JavaFX Platform.runLater and access to UI from a different thread देखें।

अपने डेटा सूची के रूप में एक ObservableList समर्थन एक TableView सक्रिय दृश्य ग्राफ़ में प्रदर्शित, आप ObservableList संशोधित रूप है, यह tableview करने के लिए परिवर्तन की घटनाओं यह नहीं बल्कि JavaFX आवेदन थ्रेड से अपने उपयोगकर्ता धागे से संशोधित आग - इस दौड़ का कारण बनता है परिस्थितियों और असंगत कार्यक्रम विफलताओं।

कैसे, यह

आपकी समस्या का समाधान करने के लिए फिक्स Platform.runLater अंदर डेटा आइटम अद्यतन करने के लिए कॉल रैप करने के लिए:

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

run विधि Platform.runLater को प्रस्तुत की सामग्री पर क्रियान्वित कर रहे हैं जावाएफएक्स एप्लीकेशन थ्रेड।