Propertyvaluefactory javafx что это
Класс javafx.scene.control.TableView предназначен для создания табличных представлений. С помощью параметра S в угловых скобках определяется тип данных, которые будут отображаться в таблице.
Для создания TableView можно принять один из двух конструкторов класса:
- TableView() : создает пустую таблицу
- TableView(ObservableList items) : создает таблицу, заполненную данными из коллекции items
Определение данных
Для начала нам надо определить данные, которые будут выводиться в таблице. Для этого создадим новый файл Person.java, в котором определим следующий класс Person
import javafx.beans.property.*; public class Person < private SimpleStringProperty name; private SimpleIntegerProperty age; Person(String name, int age)< this.name = new SimpleStringProperty(name); this.age = new SimpleIntegerProperty(age); >public String getName() < return name.get();>public void setName(String value) < name.set(value);>public int getAge() < return age.get();>public void setAge(int value) < age.set(value);>>
Основну класса Person составляют свойства name и age, которые имеют тип SimpleStringProperty и SimpleIntegerProperty соответственно. Фактически эти типы представляю надстройку над стандартными типами String и Integer. В целом пакет javafx.beans.property еще ряд типов, которые можно использовать для определения свойств в зависимости от типа данных, которые мы хотим сохранить:
- SimpleBooleanProperty
- SimpleIntegerProperty
- SimpleDoubleProperty
- SimpleFloatProperty
- SimpleLongProperty
- SimpleStringProperty
- SimpleMapProperty
- SimpleListProperty
- SimpleSetProperty
- SimpleObjectProperty
Каждый подобный тип определяет метод get() , который возвращает хранимые данные, и метод set() , которые устанавливает данные.
При этом методы доступа — геттеры и аксессоры определять необязательно.
Определение столбцов
Любая таблица представляет набор ячеек, которые образуют на пересечении строк и столбцов. Каждая строка в таблице отображает отдельный элемент из коллекции ObservableList, которая передается через конструктор в TableView. В нашем случае каждая отдельная строка будет представлять отдельные объкт класс Person.
Для определения столбцов в TableView применяется класс TableColumn . Объект TableColumn типизируется двумя типами: параметр S представляе тот же тип, которым тизирован объект TableView (тип отображаемых в таблице данных), а параметр T передает тип данных в рамках данного столбца.
С помощью конструктора TableColumn можно определить заголовок столбца:
TableColumn(String header)
После определения столбца для него надо установить фабрику генерации значения с помощью метода setCellValueProperty() . Фабрика определяет, как ячейка будет получать значение.
В данном случае можно использовать встроенный класс javafx.scene.control.cell.PropertyValueFactory , который позволяет установить привязку столбца к определенному свойству данных с помощью конструктора:
PropertyValueFactory(String propertyName)
После этого столбец надо добавить в коллекцию столбцов TableView.
Отобразим данные класса Person в таблице:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.FlowPane; import javafx.scene.control.Label; import javafx.scene.control.TableView; import javafx.scene.control.TableColumn; import javafx.collections.ObservableList; import javafx.collections.FXCollections; import javafx.scene.control.cell.PropertyValueFactory; public class Main extends Application < public static void main(String[] args) < Application.launch(args); >@Override public void start(Stage stage) throws Exception < // создаем список объектов ObservableListpeople = FXCollections.observableArrayList( new Person("Tom", 34), new Person("Bob", 22), new Person("Sam", 28), new Person("Alice", 29) ); // определяем таблицу и устанавливаем данные TableView table = new TableView(people); table.setPrefWidth(250); table.setPrefHeight(200); // столбец для вывода имени TableColumn nameColumn = new TableColumn("Name"); // определяем фабрику для столбца с привязкой к свойству name nameColumn.setCellValueFactory(new PropertyValueFactory("name")); // добавляем столбец table.getColumns().add(nameColumn); // столбец для вывода возраста TableColumn ageColumn = new TableColumn("Age"); ageColumn.setCellValueFactory(new PropertyValueFactory("age")); table.getColumns().add(ageColumn); FlowPane root = new FlowPane(10, 10, table); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("TableView in JavaFX"); stage.show(); > >
Скомпилируем оба класса (Person и Main) и запустим программу:

Получение выделенной строки
Для получения выделенных в TableView строк используется класс TableView.TableViewSelectionModel . Для получения объекта этого класса у TableView вызывается метод getSelectionModel() . Например, выведем выделенный в таблице объект Person:
import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.FlowPane; import javafx.scene.control.Label; import javafx.scene.control.TableView; import javafx.scene.control.TableColumn; import javafx.collections.ObservableList; import javafx.collections.FXCollections; import javafx.scene.control.cell.PropertyValueFactory; import javafx.geometry.Orientation; import javafx.beans.value.ObservableValue; import javafx.beans.value.ChangeListener; public class Main extends Application < public static void main(String[] args) < Application.launch(args); >@Override public void start(Stage stage) throws Exception < // создаем список объектов ObservableListpeople = FXCollections.observableArrayList( new Person("Tom", 34), new Person("Bob", 22), new Person("Sam", 28), new Person("Alice", 29) ); Label lbl = new Label(); TableView table = new TableView(people); table.setPrefWidth(250); table.setPrefHeight(200); // столбец для вывода имени TableColumn nameColumn = new TableColumn("Name"); nameColumn.setCellValueFactory(new PropertyValueFactory("name")); table.getColumns().add(nameColumn); // столбец для вывода возраста TableColumn ageColumn = new TableColumn("Age"); ageColumn.setCellValueFactory(new PropertyValueFactory("age")); table.getColumns().add(ageColumn); TableView.TableViewSelectionModel selectionModel = table.getSelectionModel(); selectionModel.selectedItemProperty().addListener(new ChangeListener() < public void changed(ObservableValue>); FlowPane root = new FlowPane(Orientation.VERTICAL, 10, 10, lbl, table); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("TableView in JavaFX"); stage.show(); > >
В данном случае информация о выделенной строке выводится в элементе Label. Для этого у TableView.TableViewSelectionModel вызывается метод selectedItemProperty() , который возвращает объект ReadOnlyObjectProperty и предоставляет доступ к выбранному в таблице элементу. Для прослушивания изменений выделенного элемента у ReadOnlyObjectProperty вызывается метод addListener() , который устанавливает слушателя изменений.
Слушатель представляет реализацию интерфейса ChangeListener. Интерфейс также типизируется типом Person — типом объектов в таблице. В методе changed этого интерфейса с помощью параметра newVal мы можем получить новый выбранный объект Person.
Как правильно создать модель данных для TableView в JavaFX?
Создана программа, выводящая в TableView данные из SQL-запроса к Oracle (12c).
Проблема в том, что некоторые данные в TableView выводятся, некоторые — нет.
Код программы:
//1. Класс Controller package sample; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.SelectionMode; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.AnchorPane; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import java.sql.*; import java.util.Formatter; public class Controller extends Const < @FXML private ResourceBundle resources; @FXML private URL location; @FXML private AnchorPane podlojkaInt; @FXML private Button buttonClick; @FXML private TableColumncolumnOne; @FXML private TableColumn columnTwo; @FXML private TableColumn columnThree; @FXML private TableColumn columnFour; @FXML private TableColumn columnFive; @FXML private TableColumn columnSix; @FXML private TableColumn columnSeven; @FXML private TableView tableShow; @FXML void initialize() < ObservableListlist = FXCollections.observableArrayList(); tableShow.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); tableShow.getSelectionModel().setCellSelectionEnabled(true); buttonClick.setOnAction(event -> < DatabBaseHandler connect = new DatabBaseHandler(); String sql = "SELECT * FROM TABLE.NAME WHERE ID_COLUMN1 = 12 AND ID_COLUMN2 = 1234"; try < Statement statement = connect.getDbConnection().createStatement(); ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) < String column3 = resultSet.getString(3); System.out.println(column3); list.add(new DataModelSQL(resultSet.getString(1),resultSet.getString(2), resultSet.getString(3),resultSet.getString(4), resultSet.getString(5),resultSet.getString(6), resultSet.getString(7))); columnOne.setCellValueFactory(new PropertyValueFactory("idV")); columnTwo.setCellValueFactory(new PropertyValueFactory("idS")); columnThree.setCellValueFactory(new PropertyValueFactory("val")); columnFour.setCellValueFactory(new PropertyValueFactory("idUser")); columnFive.setCellValueFactory(new PropertyValueFactory("idVParent")); columnSix.setCellValueFactory(new PropertyValueFactory("dateAdd")); columnSeven.setCellValueFactory(new PropertyValueFactory("visible")); tableShow.setItems(list); > resultSet.close(); statement.close(); > catch (SQLException | ClassNotFoundException e) < e.printStackTrace(); System.out.println(e.getMessage()); >>); > > //2. Класс DataModelSQL package sample; import javafx.beans.property.*; //это класс для модели данных, получаемых из БД public class DataModelSQL < private SimpleStringProperty idV; private SimpleStringProperty idS; private SimpleStringProperty val; private SimpleStringProperty idUser; private SimpleStringProperty idVParent; private SimpleStringProperty dateAdd; private SimpleStringProperty visible; public DataModelSQL(String idV, String idS, String val, String idUser, String idVParent, String dateAdd, String visible) < this.idV = new SimpleStringProperty(idV); this.idS = new SimpleStringProperty(idS); this.val = new SimpleStringProperty(val); this.idUser = new SimpleStringProperty(idUser); this.idVParent = new SimpleStringProperty(idVParent); this.dateAdd = new SimpleStringProperty(dateAdd); this.visible = new SimpleStringProperty(visible); >public String getIdV() < return idV.get();>public void setIdV(String value) < idV.set(value);>public String getIdS() < return idSlv.get();>public void setIdS(String value) < idSlv.set(value);>public String getVal() < return val.get();>public void setVal(String value) < val.set(value);>public String getIdUser() < return idUser.get();>public void setIdUser(String value) < idUser.set(value);>public String getIdVParent() < return idVParent.get();>public void setIdVParent(String value) < idVParent.set(value);>public String getDateAdd() < return dateAdd.get();>public void setDateAdd(String value) < dateAdd.set(value);>public String getVisible() < return visible.get();>public void setVisible(String value) < visible.set(value);>>
TableView выводит результаты колонок: 2, 4, 6, 7, не выводит — 1, 3, 5.
Типы данных в колонках:
1 — number
2 — number
3 — varchar2(2000)
4 — number
5 — number
6 — timestamp
7 — number
По тем колонкам, в которых данные не выводятся, вылетает ошибка, пример:
Can not retrieve property ‘idVParent’ in PropertyValueFactory: javafx.scene.control.cell.PropertyValueFactory@b0e3501 with provided class type: class sample.DataModelSQL
java.lang.IllegalStateException: Cannot read from unreadable property idVParent
Не совсем понятно, что имеется в виду под «не читаемым свойством».
Тем не менее, полагаю, дело в модели данных и ее работе с типами данных, так как
с помощью тестового кода:
String column3 = resultSet.getString(3); System.out.println(column3);
в цикле while, удавалось в консоль вывести значение колонки №3, которую не выводит TableView.
Поэтому, в итоге вопрос: что неверно прописано в моей модели данных?
Дело в типах данных, прописанных в классе-модели DataModelSQL или в неверном обращении к ней из класса Controller?
Также не откажусь от замечаний по общему написанию кода.
- Вопрос задан более двух лет назад
- 708 просмотров
Propertyvaluefactory javafx что это
Класс PropertyValueFactory
Класс PropertyValueFactory реализует интерфейс Callback, ObservableValue> и обеспечивает создание объектов-аргументов метода setCellFactory() класса TableColumn.
Класс PropertyValueFactory имеет следующие конструкторы и методы:
- Конструктор public PropertyValueFactory(java.lang.String property).
- Метод public ObservableValue call(TableColumn.CellDataFeatures param) – реализация метода call() интерфейса Callback.
- Метод public final java.lang.String getProperty() – возвращает имя свойства.
Наши услуги
Наши разработки находятся на переднем крае высоких технологий
Мы проектируем, разрабатываем веб сайты
Индивидуальный дизайн сайта
Создание динамичных сайтов
Верстка и программирование
Мы разрабатываем информационные системы
Автоматизация бизнес-процессов малого и среднего бизнеса
Сбор, хранение и обработка данных
Использование облачных технологий
Мы создаем мобильные приложения
Интеграция с веб сайтом
Создание мобильных версий веб сайтов
Использование дополненной реальности и компьютерного зрения
О нас
Компания NOV Tech Solutions специализируется на разработке сервисов для оперативного управления бизнесом, создании веб приложений и мобильных приложений под заказ
NOV Tech Solutions это команда высококвалифицированных специалистов, работающих на результат
Мы работаем быстро и качественно, используя самые современные технологии
Мы ценим и и заботимся о наших заказчиках, постоянно улучшая сервис и расширяя перечень услуг
Propertyvaluefactory javafx что это
Реализация удобства интерфейса Обратного вызова, специально разработанного для использования в пределах TableColumn cell value factory . Пример того, как использовать этот class:
TableColumn firstNameCol = new TableColumn("First Name"); firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));
В этом примере строка «firstName» используется в качестве ссылки на принятый firstNameProperty() метод в Person Тип class (который является типом class TableView items список). Дополнительно, этот метод должен возвратить a Property экземпляр. Если метод, удовлетворяющий эти требования, находится, то TableCell заполняется с этим ObservableValue . Кроме того, TableView автоматически добавит наблюдателя к возвращенному значению, так, что любые запущенные изменения будут наблюдаться TableView, приводящим к ячейке, сразу обновляющей. Если никакой метод, соответствующий этот образец, не существует, есть, проваливаются, поддержка попытки вызвать добирается (), или () (то есть, getFirstName() или isFirstName() в примере выше). Если метод, соответствующий этот образец, существует, значение, возвращенное из этого метода, обертывается в a ReadOnlyObjectWrapper и возвратился в TableCell. Однако, в этой ситуации, это означает, что TableCell не будет в состоянии наблюдать ObservableValue для изменений (как имеет место в первом подходе выше). Для ссылки (и как отмечено в TableColumn cell value factory документация), длинная форма кода выше была бы следующим:
TableColumn firstNameCol = new TableColumn("First Name"); firstNameCol.setCellValueFactory(new Callback, ObservableValue>() < public ObservableValuecall(CellDataFeatures p) < // p.getValue() returns the Person instance for a particular TableView row return p.getValue().firstNameProperty(); >>); >
Сводка конструктора
Создает значение по умолчанию PropertyValueFactory, чтобы извлечь значение из данного элемента строки TableView отражающим образом, используя данное имя свойства.
Сводка метода
| Модификатор и Тип | Метод и Описание |
|---|---|
| ObservableValue | call(TableColumn.CellDataFeatures param) |
call метод вызывают когда требующийся, и дается единственный параметр типа P с требованием, чтобы объект типа R был возвращен.
Возвращает имя свойства, обеспеченное в конструкторе.
Методы, наследованные от class java.lang. Объект
Деталь конструктора
PropertyValueFactory
public PropertyValueFactory(java.lang.String property)
Создает значение по умолчанию PropertyValueFactory, чтобы извлечь значение из данного элемента строки TableView отражающим образом, используя данное имя свойства.
Деталь метода
вызвать
public ObservableValueT> call(TableColumn.CellDataFeaturesS,T> param)
call метод вызывают когда требующийся, и дается единственный параметр типа P с требованием, чтобы объект типа R был возвращен.
getProperty
public final java.lang.String getProperty()