2013-03-10 6 views
5

मैं उपयोगी जानकारी को छोड़ दिए बिना जितना संभव हो छोटा होना चाहता हूं। मैं निम्नलिखित वर्ग है:JavaFX TableView के लिए आइटम कैसे सेट करें - ऑब्जेक्ट में कोई अन्य ऑब्जेक्ट है?

public class Address{ 
StringProperty city = new SimpleStringProperty(); 
StringProperty street = new SimpleStringProperty(); 

//following the constructor, getters and setters 
... 
} 

मैं किसी अन्य वर्ग ग्राहक है, कि एक कोई पता सदस्य

public class Client { 

StringProperty name = new SimpleStringProperty(); 
StringProperty id = new SimpleStringProperty(); 
ObjectProperty<Address> address = new SimpleObjectProperty<>(); 

//following the constructor, getters and setters 
... 
} 

और एक नियंत्रक के साथ एक JavaFX इंटरफ़ेस है कि एक tableview उद्देश्य यह है कि 3 में उत्पादन करना चाहिए शामिल है दिए गए ऑब्जेक्ट के लिए क्लाइंट क्लास के सदस्यों और पता वर्ग के शहर के सदस्य को कॉल करें। मेरे tableview और TableColumn परिभाषा निम्नलिखित कोड

public class SettingsController { 
TableColumn<Client, String> clientNameCol; 
TableColumn<Client, String> clientEmailCol; 
TableColumn<Client, String> clientCityCol; 
private TableView<Client> clientSettingsTableView; 
... 
... 
    clientNameCol = new TableColumn<>("Name"); 
    clientNameCol.setCellValueFactory(new PropertyValueFactory<Client, String>("name")); 

    clientEmailCol = new TableColumn<>("email"); 
    clientEmailCol.setCellValueFactory(new PropertyValueFactory<Client, String>("email")); 

    clientCityCol = new TableColumn<>("City"); 
    clientCityCol.setCellValueFactory(new PropertyValueFactory<Client, String>("city")); 

    clientSettingsTableView.setItems(clientData); 
    clientSettingsTableView.getColumns().clear(); 
    clientSettingsTableView.getColumns().addAll(clientNameCol, clientEmailCol, clientCityCol); 

और निश्चित रूप से वहाँ है एक ObservableList clientData कि ग्राहक वस्तु की एक सरणी शामिल हैं। सबकुछ उस कॉलम को छोड़कर ठीक काम करता है जो प्रत्येक ग्राहक के लिए शहर को आउटपुट करना चाहिए। क्लाइंट ऑब्जेक्ट के शहर (एक पता सदस्य द्वारा निहित) के लिए कॉलम को कैसे परिभाषित किया जाना चाहिए? आपकी मदद के लिए

+0

उपयोगी http://fxapps.blogspot.com/2012/09/showing-object-properties-in-tableview.html हो सकता है – invariant

उत्तर

6

@invariant धन्यवाद, मैं थोड़ा और अधिक googled और मैं निम्नलिखित समाधान के साथ समाप्त हो गया:

clientCityCol = new TableColumn<>("City"); 
clientCityCol.setCellValueFactory(new PropertyValueFactory<Client, Address>("address")); 
// ======== setting the cell factory for the city column 
clientCityCol.setCellFactory(new Callback<TableColumn<Client, Address>, TableCell<Client, Address>>(){ 

     @Override 
     public TableCell<Client, Address> call(TableColumn<Client, Address> param) { 

      TableCell<Client, Address> cityCell = new TableCell<Client, Address>(){ 

       @Override 
       protected void updateItem(Address item, boolean empty) { 
        if (item != null) { 
         Label cityLabel = new Label(item.getCity()); 
         setGraphic(cityLabel); 
        } 
       }      
      };    

      return cityCell;     
     } 

    }); 

पता वर्ग एक गेटर getCity (है) जो एक स्ट्रिंग के रूप में शहर के सदस्य रिटर्न ()।

+0

सच मुझे धन्यवाद +1 @markus में मदद की। यह एक सामान्य डिजाइन स्थिति होनी चाहिए, लेकिन मुझे वेब पर जानकारी की एक दुर्लभता मिलती है। भविष्य के सभी आगंतुकों के लिए, इस पर आधिकारिक दस्तावेज में कुछ नहीं है? – demongolem

+0

बस जो मैं देख रहा था, आप वास्तव में अपडेट पर जो कुछ भी चाहते हैं उसे आकर्षित कर सकते हैं Iemem –

0

यह fxml में काम करता है?

<TableColumn prefWidth="8" text="City"> <cellValueFactory > <PropertyValueFactory property="adress.city" /> </cellValueFactory> </TableColumn>

कार्य कि जिस तरह से मैं एक खाली सेल है:

निम्नलिखित कोड पर विचार करें।

+7

क्या यह कोई प्रश्न या उत्तर है? – jewelsea

+0

इस उत्तर के लिए धन्यवाद। मुझे लगता है कि मैंने अभी एक संपूर्ण [अन्य पहलू] खोजा है (https://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm#CACHDCCF) javafx fxml का – smac89

0

आप यह उल्लेख करना भूल गए कि आपको क्लाइंटसिटीकॉल TableColumn<Client, String> clientCityCol; की परिभाषा TableColumn<Client, Address> clientCityCol; में बदलनी है अन्यथा यह काम नहीं करेगा।

संबंधित मुद्दे