2013-03-10 39 views
5

tôi muốn ngắn nhất có thể mà không bỏ qua thông tin hữu ích. Tôi có lớp sau:Cách đặt mục cho JavaFX TableView - đối tượng có chứa một đối tượng khác?

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

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

Tôi có một khách hàng hạng nhất, mà người ta có một thành viên Địa chỉ

public class Client { 

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

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

và một giao diện với một bộ điều khiển JavaFX có chứa một đối tượng TableView rằng nên đầu ra trong 3 cột các thành viên của lớp Client và thành viên của lớp Address cho đối tượng đã cho. Định nghĩa TableView và TableColumn của tôi là mã sau đây

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

và dĩ nhiên có một khách hàng ObservableListData chứa một mảng đối tượng Khách hàng. Mọi thứ hoạt động tốt ngoại trừ cột sẽ xuất thành phố cho từng khách hàng. Làm cách nào để xác định cột cho thành phố (được chứa bởi một thành viên Địa chỉ) của đối tượng Khách hàng?

+0

có thể hữu ích http://fxapps.blogspot.com/2012/09/showing-object-properties-in-tableview.html – invariant

Trả lời

6

nhờ @invariant sự giúp đỡ của bạn, tôi googled một chút nữa và tôi đã kết thúc với các giải pháp sau đây:

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

    }); 

Địa chỉ lớp học có một getCity getter() mà trả về thành viên thành phố như là một String ().

+0

Thực sự đã giúp tôi @markus cảm ơn +1. Đây phải là một tình huống thiết kế chung, nhưng tôi thấy một thông tin thưa thớt trên web. Đối với tất cả khách truy cập trong tương lai, không có gì trong tài liệu chính thức về điều này? – demongolem

+0

Chỉ cần những gì tôi đang tìm kiếm, bạn thực sự có thể vẽ bất cứ điều gì bạn muốn trên updateItem –

0

Điều này hoạt động trong fxml?

Xét đoạn mã sau:

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

Làm việc theo cách mà tôi có một ô trống.

+7

Đây có phải là câu hỏi hoặc câu trả lời không? – jewelsea

+0

Cảm ơn câu trả lời này. Tôi nghĩ rằng tôi vừa phát hiện ra toàn bộ [khía cạnh khác] (https://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm#CACHDCCF) của javafx fxml – smac89

0

bạn quên đề cập rằng bạn phải thay đổi định nghĩa của clientCityCol TableColumn<Client, String> clientCityCol; thành TableColumn<Client, Address> clientCityCol; nếu không nó sẽ không hoạt động.

Các vấn đề liên quan