JavaFX2.2 не все столбцы таблицы отображают данные с помощью PropertyValueFactory?

Добрый вечер всем,

Сегодня я наткнулся на довольно странную проблему, и я понятия не имею, что я делаю неправильно. Речь идет о привязке столбцов таблицы к PropertyValueFactory. Я создал табличное представление и столбцы таблицы в FXML и установил соответствующие fx:id с помощью Scene Builder.

Теперь проблема в том, что некоторые столбцы показывают ожидаемые данные, а другие столбцы просто пусты. Я добавляю элементы в табличное представление со следующим кодом, когда пользователь нажимает кнопку:

ObservableList<User> olUsers = DA_User.getUsers();
tbl_MC_Manage_Users.getItems().addAll(olUsers);

Я точно знаю, что пользовательские объекты в olUsers содержат все необходимые данные (проверено с помощью цикла for и System.out.println)

Я получаю такой результат: (‹текст›, представляющий заголовки столбцов)

<disabled>   <username>    <title>    <lastname>    <firstname>   <address>   <zip>    <city>
false        (empty)       Mr.        (empty)       (empty)       address1    (empty)  city1
false        (empty)       Miss       (empty)       (empty)       address2    (empty)  city2

Итак, по какой-то причине столбцы имени пользователя, фамилии, имени, почтового индекса не показывают никаких данных...

Некоторые части контроллера:

//declaration (these are the fx:id's connected to my table colums)
@FXML private TableView<User> tbl_MC_Manage_Users;
@FXML private TableColumn<User,Boolean> tc_MC_Manage_Disabled;
@FXML private TableColumn<User,String> tc_MC_Manage_Username;
@FXML private TableColumn<User,String> tc_MC_Manage_Title;
@FXML private TableColumn<User,String> tc_MC_Manage_Lastname;
@FXML private TableColumn<User,String> tc_MC_Manage_Firstname;
@FXML private TableColumn<User,String> tc_MC_Manage_Address;
@FXML private TableColumn<User,String> tc_MC_Manage_ZipCode;
@FXML private TableColumn<User,String> tc_MC_Manage_City;

@Override
public void initialize(URL url, ResourceBundle rb) {
...
//setting the binding on the table columns at initialize();
    tc_MC_Manage_Disabled.setCellValueFactory(new PropertyValueFactory<User, Boolean>("disabled"));
    tc_MC_Manage_Username.setCellValueFactory(new PropertyValueFactory<User, String>("username"));
    tc_MC_Manage_Title.setCellValueFactory(new PropertyValueFactory<User, String>("title")); 
    tc_MC_Manage_Firstname.setCellValueFactory(new PropertyValueFactory<User, String>("firstname"));
    tc_MC_Manage_Lastname.setCellValueFactory(new PropertyValueFactory<User, String>("lastname"));  
    tc_MC_Manage_Address.setCellValueFactory(new PropertyValueFactory<User, String>("address"));
    tc_MC_Manage_ZipCode.setCellValueFactory(new PropertyValueFactory<User, String>("zipcode")); 
    tc_MC_Manage_City.setCellValueFactory(new PropertyValueFactory<User, String>("city"));
...
}      

Вот некоторые части класса User

private SimpleBooleanProperty disabled = new SimpleBooleanProperty();
private SimpleStringProperty username = new SimpleStringProperty("");
private SimpleStringProperty title = new SimpleStringProperty("");
private SimpleStringProperty lastname = new SimpleStringProperty("");
private SimpleStringProperty firstname = new SimpleStringProperty("");
//... (same for the others)

//getters
public boolean isDisabled() { return disabled.get(); }
public String getTitle() { return title.get(); }
public String getUsername() { return username.get(); }
public String getLastName() { return lastname.get(); }
public String getFirstName() { return firstname.get(); }
//... (same for the others)

//setters
public void setDisabled(boolean value) { disabled.set(value); }
public void setUsername(String value) { username.set(value); }
public void setTitle(String value) { title.set(value); }
public void setLastName(String value) { lastname.set(value); }
public void setFirstName(String value) { firstname.set(value); }  
//... (same for the others)

Извините за большое количество кода, но я действительно не понимаю, почему только несколько столбцов получают свои данные. Надеюсь, кто-то может указать мне правильное направление :)

Заранее спасибо!


person Perneel    schedule 15.08.2012    source источник


Ответы (1)


Если ваш установщик называется getFirstName, тогда свойство firstName с заглавной "N". Попробуйте следующее:

tc_MC_Manage_Disabled.setCellValueFactory(new PropertyValueFactory<User, Boolean>("disabled"));
tc_MC_Manage_Username.setCellValueFactory(new PropertyValueFactory<User, String>("userName"));
tc_MC_Manage_Title.setCellValueFactory(new PropertyValueFactory<User, String>("title")); 
tc_MC_Manage_Firstname.setCellValueFactory(new PropertyValueFactory<User, String>("firstName"));
tc_MC_Manage_Lastname.setCellValueFactory(new PropertyValueFactory<User, String>("lastName"));  
tc_MC_Manage_Address.setCellValueFactory(new PropertyValueFactory<User, String>("address"));
tc_MC_Manage_ZipCode.setCellValueFactory(new PropertyValueFactory<User, String>("zipCode")); 
tc_MC_Manage_City.setCellValueFactory(new PropertyValueFactory<User, String>("city"));

Также я бы посоветовал вам добавить property методов в User класс:

public StringProperty titleProperty() { return title; }; // etc

это позволит вашей таблице отражать изменения данных. См. 2-ю часть Привязка элементов JavaFX 2 TableView

person Sergey Grinev    schedule 15.08.2012
comment
Хах, как я мог это пропустить... Спасибо за быстрый и четкий ответ Сергей! - person Perneel; 16.08.2012
comment
У меня возникли проблемы с setCellValueFactory(new PropertyValueFactory(first)) где first является свойством. Ваш совет мне очень помог! Я создал public SimpleBooleanProperty firstProperty(), и все заработало. Спасибо Сергей!! - person HowYaDoing; 25.09.2017