2013-03-10 9 views
5

voglio essere il più breve possibile senza omettere informazioni utili. Ho la seguente classe:Come impostare gli elementi per JavaFX TableView - l'oggetto contiene un altro oggetto?

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

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

Ho un'altra classe client, che si ha un elemento Indirizzo

public class Client { 

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

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

e un'interfaccia JavaFX con un controller che contiene un oggetto TableView che deve emettere in 3 colonna i membri della classe Client e il membro della città della classe Address per l'oggetto specificato. Il mio TableView e TableColumn definizione sono il seguente codice

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

e, naturalmente, c'è un clientData ObservableList che contiene una serie di oggetti client. Tutto funziona bene tranne la colonna che dovrebbe produrre la città per ogni cliente. Come dovrei definire la colonna per la città (contenuta da un membro Indirizzo) dell'oggetto Cliente?

+0

potrebbe essere utile http://fxapps.blogspot.com/2012/09/showing-object-properties-in-tableview.html – invariant

risposta

6

@invariant grazie per il vostro aiuto, ho cercato su google un po 'di più e ho finito con la seguente soluzione:

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

    }); 

classe Address ha una getCity getter(), che restituisce il membro città come String ().

+0

Mi ha davvero aiutato @markus grazie +1. Questa deve essere una situazione progettuale comune, ma trovo una scarsità di informazioni sul web. Per tutti i futuri visitatori, non c'è qualcosa nella documentazione ufficiale su questo? – demongolem

+0

Proprio quello che stavo cercando, si può effettivamente disegnare tutto quello che vuoi su updateItem –

0

Questo funziona in fxml?

Si consideri il seguente codice:

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

Lavorare in questo modo ho una cella vuota.

+7

Questa è una domanda o una risposta? – jewelsea

+0

Grazie per questa risposta. Penso di aver appena scoperto un intero [altro aspetto] (https://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm#CACHDCCF) di javafx fxml – smac89

0

hai dimenticato di dire che devi cambiare la definizione di clientCityCol TableColumn<Client, String> clientCityCol; in TableColumn<Client, Address> clientCityCol; altrimenti non funzionerà.

Problemi correlati