Свойство String отличается в Java. В основном вы используете свойство String, когда хотите наблюдать за своей переменной в TableView. Java делает это потому, что Java использует шаблон MVC (Model-View-Controller). Модель - это ваши сохраненные данные, представление - это то, что вы видите как графический интерфейс, а контроллер - это мозг и логика для всего в вашем приложении. Модель в Java сделана как классы, которые содержат свойства, а не только поля. Поскольку, когда вы хотите сохранить данные в TableView в JavaFX, правильным способом является создание экземпляров объектов из класса, а свойства, определенные в этом классе, становятся свойствами этого объекта, к тому времени вы можете сохранить объект в TableView и поместить некоторую логику. чтобы разрешить tableView найти свойства этого объекта и заполнить их в таблице, если бы они были строками, а не свойствами, JavaFX не сможет получить их и сделать их видимыми в таблице. Я написал некоторую логику ниже, чтобы дать вам представление о том, как это делается. Итак, сначала это класс, который действует как модель:
public class Contact extends SQL_Objects {
private SimpleStringProperty id;
private SimpleStringProperty firstName;
private SimpleStringProperty lastName;
private SimpleStringProperty phone;
private SimpleStringProperty email;
private SimpleStringProperty unitNo;
private SimpleStringProperty street;
private SimpleStringProperty city;
private SimpleStringProperty province;
private SimpleStringProperty zipCode;
private SimpleStringProperty country;
private SimpleStringProperty gender;
private SimpleStringProperty notes;
private SimpleStringProperty relationship;
private final static String[] FIELD_NAMES = { "id", "firstName", "lastName", "phone", "email", "unitNo", "street", "city", "province", "zipCode", "country", "gender", "notes", "relationship" };
public Contact(String id, String firstName, String lastName, String phone, String email, String unitNo, String street, String city, String province, String zipCode, String country, String gender, String notes, String relationship) {
this.id = new SimpleStringProperty(id);
this.firstName = new SimpleStringProperty(firstName);
this.lastName = new SimpleStringProperty(lastName);
this.phone = new SimpleStringProperty(phone);
this.email = new SimpleStringProperty(email);
this.unitNo = new SimpleStringProperty(street);
this.street = new SimpleStringProperty(street);
this.city = new SimpleStringProperty(city);
this.province = new SimpleStringProperty(province);
this.zipCode = new SimpleStringProperty(zipCode);
this.country = new SimpleStringProperty(country);
this.gender = new SimpleStringProperty(gender);
this.notes = new SimpleStringProperty(notes);
this.relationship = new SimpleStringProperty(relationship);
}
public String getId() {
return id.get();
}
public String getFirstName() {
return firstName.get();
}
public String getLastName() {
return lastName.get();
}
public String getPhone() {
return phone.get();
}
public String getEmail() {
return email.get();
}
public String getUnitNo() {
return unitNo.get();
}
public String getStreet() {
return street.get();
}
public String getCity() {
return city.get();
}
public String getProvince() {
return province.get();
}
public String getZipCode() {
return zipCode.get();
}
public String getCountry() {
return country.get();
}
public String getGender() {
return gender.get();
}
public String getNotes() {
return notes.get();
}
public String getRelationship() {
return relationship.get();
}
public static String[] getFieldNames() {
return FIELD_NAMES;
}
Эти геттеры и сеттеры должны следовать Стандартам соглашений об именах в Java, чтобы при вставке и объекте в таблицу, как я покажу ниже, таблица будет использовать имена полей и выборку для метода получения для каждого поля, чтобы получить его значение и сделать его видимым в таблице, поэтому ниже приведен пример контроллера для заполнения столбцов и строк таблицы:
private void fillColumns() {
try { // starting from 2 so that the id column is not included
for (int i = 2; i <= resultSet.getMetaData().getColumnCount(); i++ ) {
TableColumn column = new TableColumn(resultSet.getMetaData().getColumnName(i));
column.setCellValueFactory(new PropertyValueFactory<Contact, String>(Contact.getFieldNames()[i - 1]));
selectedTable.getColumns().add(column);
}
} catch (SQLException ex) {
Alert alert = new Alert(Alert.AlertType.ERROR, "Type:\n" + ex.getClass().getName() + "\n\nMessage: Unable to get the columns from the database\n\nDetails:\n" + ex.getMessage(), ButtonType.OK);
}
}
Далее необходимо заполнить строки, если я выбрал данные из базы данных и сохранил их в результирующем наборе. Я буду использовать следующий метод для просмотра записей результирующего набора построчно, этот метод будет возвращать false, когда строк больше нет
private void fillRows() {
shownRecords = 0;
try {
while(resultSet.next()) {
Contact cont = new Contact(Integer.toString(resultSet.getInt(1)), resultSet.getString(2), resultSet.getString(3), resultSet.getString(4), resultSet.getString(5), resultSet.getString(6), resultSet.getString(7), resultSet.getString(8), resultSet.getString(9), resultSet.getString(10), resultSet.getString(11), resultSet.getString(12), resultSet.getString(13), resultSet.getString(14));
tableView.getItems().add(cont);
}
resultSet.beforeFirst();
} catch (SQLException ex) {
Alert alert = new Alert(Alert.AlertType.ERROR, "Type:\n" + ex.getClass().getName() + "\n\nMessage: Unable to get the records from the database\n\nDetails:\n" + ex.getMessage(), ButtonType.OK);
alert.show();
}
}
Итак, как вы можете видеть, я использовал SimpleStringProperty, а не Strings, и если бы вы использовали здесь Strings, JavaFx не смог бы отображать результаты, так как они как-то не считаются свойствами объектов, вставленных в таблицу