В отличие от Swing, JavaFX TableView не использует отдельную модель. Вместо этого данные являются моделью. Вы передаете эти данные в TableView, используя метод setItems TableView.
Это означает, что вам нужно создать класс для хранения ваших данных. Поскольку ваша таблица называется records
, я бы назвал класс данных Record
.
Если вы посмотрите документацию классов JavaFX, вы должны заметить шаблон. Свойства бина являются инкапсулированными атрибутами, которые состоят из трех методов:
- Метод чтения, который всегда начинается с
get
, за которым следует заглавная буква. ¹ - Метод записи, который всегда начинается с
set
, за которым следует заглавная буква .² - Метод свойства, имя которого всегда заканчивается на
Property
.
Например, рассмотрим класс javafx.stage.Window . Он имеет свойство «непрозрачность», которое представлено следующими методами:
Ваш класс данных должен следовать той же схеме:
public class Record {
private final StringProperty id;
private final StringProperty name;
private final StringProperty address;
private final StringProperty phone;
public Record() {
id = new SimpleStringProperty(this, "id");
name = new SimpleStringProperty(this, "name");
address = new SimpleStringProperty(this, "address");
phone = new SimpleStringProperty(this, "phone");
}
public StringProperty idProperty() { return id; }
public String getId() { return id.get(); }
public void setId(String newId) { id.set(newId); }
public StringProperty nameProperty() { return name; }
public String getName() { return name.get(); }
public void setName(String newName) { name.set(newName); }
public StringProperty addressProperty() { return address; }
public String getAddress() { return address.get(); }
public void setAddress(String newAddress) { address.set(newAddress); }
public StringProperty phoneProperty() { return phone; }
public String getPhone() { return phone.get(); }
public void setPhone(String newPhone) { phone.set(newPhone); }
@Override
public String toString() {
return String.format("%s[id=%s, name=%s]",
getClass().getName(), getId(), getName());
}
}
Создать эти объекты просто :
@FXML
private TableView<Record> table;
@FXML
private TableColumn<Record, String> idColumn;
@FXML
private TableColumn<Record, String> nameColumn;
@FXML
private TableColumn<Record, String> addressColumn;
@FXML
private TableColumn<Record, String> phoneColumn;
// ...
ObservableList<Record> records = FXCollections.observableArrayList();
try (ResultSet rs = pst.executeQuery()) {
while (rs.next())
{
Record record = new Record();
record.setId(rs.getString("id"));
record.setName(rs.getString("name"));
record.setAddress(rs.getString("address"));
record.setPhone(rs.getString("phone"));
records.add(record);
}
}
table.setItems(records);
Вместо табличной модели вы должны вместо каждого столбца таблицы указывать, какие данные должны отображаться:
idColumn.setCellValueFactory(f -> f.getValue().idProperty());
nameColumn.setCellValueFactory(f -> f.getValue().nameProperty());
addressColumn.setCellValueFactory(f -> f.getValue().addressProperty());
phoneColumn.setCellValueFactory(f -> f.getValue().phoneProperty());
¹ Чтение методов, тип возвращаемых данных которых является примитивным логическим значением может использовать is
вместо get
.
² Методы записи не нужны для свойств только для чтения.