2013-03-10 15 views
5

私は有用な情報を省略することなくできるだけ短くしたい。 私は、次のクラスがあります。私は別のクラスのクライアントがJavaFX TableViewの項目を設定する方法 - オブジェクトに別のオブジェクトが含まれていますか?

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

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

を、1つはアドレス部材

public class Client { 

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

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

及び3でなければならない出力テーブルビューオブジェクトを含むコントローラとJavaFXのインタフェースを有しています指定されたオブジェクトのClientクラスのメンバとAddressクラスのメンバを列にします。私のテーブルビューと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は、Clientオブジェクトの配列が含まれていることがあります。 各クライアントの都市を出力する列以外はすべて正常に動作します。 Clientオブジェクトの都市(Addressメンバーに含まれる)の列を定義するにはどうすればよいですか? (

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

参考になる可能性があります。http://fxapps.blogspot.com/2012/09/showing-object-properties-in-tableview.html – invariant

答えて

6

@invariantおかげで、私はより少しググと私は、次の解決策になってしまいました)。

+0

本当に助けてくれました。これは一般的な設計状況でなければなりませんが、私はWeb上で情報の希薄さを見出します。将来のすべての訪問者には、公式文書にはこれに関する何かがありますか? – demongolem

+0

ちょうど私が探していたもの、あなたが実際にあなたが欲しいものを描画することができますupdateItem –

0

これはfxmlで機能しますか?私は空白のセルを持ってそのように作業する

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

は、次のコードを考えてみましょう。

+7

これは質問ですか? – jewelsea

+0

この回答に感謝します。私はjavafx fxmlの全体的な[その他の側面](https://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm#CACHDCCF)を発見したと思います – smac89

0

あなたはclientCityCol TableColumn<Client, String> clientCityCol;の定義をTableColumn<Client, Address> clientCityCol;に変更する必要があることを忘れてしまったことを忘れてしまった場合、それは機能しません。

関連する問題