powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / заполнение TableView таблички
11 сообщений из 11, страница 1 из 1
заполнение TableView таблички
    #39629943
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Столкнулся со следующей трудностью, которую не могу решить:

Есть TableView (на скрине верхняя правая таблица, пока пуста)


Пытаюсь ее заполнить. Предполагаю, что колонок в ней всегда будет 2, и она будет перезаполняться автоматически при клике по строкам нижней таблицы. Заполнять хочу условно говоря, транспонируя данные из нижней таблицы в верхнюю, в 2 колонки.

для это таблички созданы следующие переменные:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    @FXML
    private TableView<ObservableList<String>> tableRows; //нижняя таблица - источник данных
    @FXML
    private TableView<ObservableList<String>> tablebyOneRow; //верхняя таблица,вопрос по которой задаю
    @FXML
    private TableColumn<ObservableList<String>, String> FieldName; //1 колонка верхней таблицы
    @FXML
    private TableColumn<ObservableList<String>, String> FieldValue; //2 колонка верхней таблицы




в методе инициализации выставил следующий листенер:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
...
tableRows.getSelectionModel().selectedItemProperty().addListener(
                (observable, oldValue, newValue) -> {
                    if (newValue != null) {
                        int i = 0;
//Данные совершенно точно присутствуют
                        System.out.println("Column Name: "+tableRows.getColumns().get(0).getText());
                        System.out.println("Column data: "+tableRows.getSelectionModel().getSelectedItem().get(0));

// но я не знаю как тут установить фабрику значений в ячейки. разные варианты пробовал.
//                        FieldName.setCellFactory(); 
//                        FieldValue.setCellFactory();
                        FieldName.setCellValueFactory(new PropertyValueFactory<ObservableList<String>,String>(tableRows.getColumns().get(0).getText()));
                        FieldValue.setCellValueFactory(new PropertyValueFactory<ObservableList<String>,String>(tableRows.getSelectionModel().getSelectedItem().get(0)));

                    }
                });



листинг .fxml файла

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<StackPane prefHeight="150.0" prefWidth="200.0">
   <children>
      <TableView fx:id="tablebyOneRow" prefHeight="200.0" prefWidth="200.0">
        <columns>
          <TableColumn fx:id="FieldName" prefWidth="97.0" text="FieldName" />
          <TableColumn fx:id="FieldValue" prefWidth="133.0" text="FieldValue" />
        </columns>
      </TableView>
   </children>
</StackPane>




может кто подсказать, что я делаю не так? как нужно обвернуть данные, чтобы они корректно отображались в таблице?
Если вопрос не ясно изложил, уточните, пожалуйста.
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630006
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам нужно разобраться в том что в JavaFX всё построено на биндингах и в том чтобы начать читать документацию.
Вот тут сказано что именно конструктор потребляет в качестве параметра.
https://docs.oracle.com/javafx/2/api/javafx/scene/control/cell/PropertyValueFactory.html#PropertyValueFactory(java.lang.String)
Вы назначение этого класса, похоже не поняли.

Данные же к таблице биндятся через TableView.items. Вы это свойство где-то используете вообще для верхней таблицы?
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630009
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы подсказал решение, если бы понимал что вообще нужно.
tableRows.getColumns().get(0).getText() - всегда одно и тоже значение, зачем его менять внутри слушателя.
Вообще слушатели это наследие Swing. В JavaFX если что-то можно привязать, то лучше привязать, а не делать слушателя.
Вам нужно просто связать TableView.SelectionModel.selectedItem одной таблицы к TableView.items другой таблицы.
Единственная проблема что надо как-то трансформировать значение. Вот тут я не знаю какой способ оптимальнее, так как с JavaFX не работаю особо.
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630013
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630029
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
к сожалению, я действительно не понял назначение класса PropertyValueFactory, это уже оконечный пример из других примеров, в которых я искал ответ.

tableRows.getColumns().get(0).getText() - это значение тоже переменчиво. Это первая колонка нижней таблички (первая просто для примера проверки себя). В свою очередь нижняя перезаполняется из TreeView, тоже слушателем. Но она динамическая, т.к. количество колонок в ней заранее неизвестно. В общем, данные меняются.

Как я понял из документации, вставка элементов items делается когда заполнение идет динамическим путем, т.е. в цикле например. А для варианта со статичными колонками я должен указать "фабрику заполнения ячеек" (если английский не подводит)

Вопрос мой фактически можно переформулировать так:
как для метода FieldName.setCellValueFactory() обвернуть строку со значением, чтобы она стала совместима с ожидаемым типом объекта?

Про итемы пойду еще покурю доку. может всетаки недопонял
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630035
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Назначение CellValueFactory это взять из items значение применяет к нему эту CellValueFactory чтобы получить из объекта текст для отображения в ячейку. Это трансформатор объекта строки в текст ячейки.

авторtableRows.getColumns().get(0).getText() - это значение тоже переменчиво.
Оно не зависит от выбора в таблице, но меняется при смене выбора зачем-то.

авторкак для метода FieldName.setCellValueFactory() обвернуть строку со значением, чтобы она стала совместима с ожидаемым типом объекта?
Его не надо "оборачивать". Его надо вернуть
Код: java
1.
() -> myStringVariable
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630067
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В вашем случае можно написать так
Код: java
1.
2.
 FieldName.setCellValueFactory(() -> tableRows.getColumns().get(0).getText());
FieldValue.setCellValueFactory(() -> tableRows.getSelectionModel().getSelectedItem().get(0));


Но лично я не считаю это красивым.
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630068
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, в items надо какую-нибудь фигню положить всё равно. Иначе строк не будет.
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630075
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, в идеале, нужно завести новый JavaFX объект, который будет строкой (item) в верхней таблице.
А свойства этого объекта уже прибиндить к tableView.selectionModel.selectedItem.yourDomainProperty
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630080
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolfioА для варианта со статичными колонками я должен указать "фабрику заполнения ячеек"
в дизайнере Open with SceneBuilder рисуешь колонки и табличку
...
Рейтинг: 0 / 0
заполнение TableView таблички
    #39630700
wolfio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения за затяжной ответ. Сурсов под рукой не было.
Blazkowicz,
вы оказались правы на счет итемов. Класть я их должен был.

BlazkowiczЕго не надо "оборачивать". Его надо вернуть
Код: java
1.
() -> myStringVariable


Дело в том, что в таком варианте вы возращаете в качестве параметра String, а ожидается ObservableString<>, поэтому я и спрашивал как бы строку обвернуть.
Попробовав и ваш способ стал, на который компилятор тоже ругается, уже искать ответы по тексту ошибки. Нашел вот такое описание на StackOverflow.

Тут как раз описаны 2 способа, один из которых по вашему некрасивый :)
Правда второй вариант нужен, если мне данные потребуется поменять в таблице, но т.к. я просто читаю, то обошелся простым вариантом.
Кстати, почему вы считаете этот код плохим?
BlazkowiczВ вашем случае можно написать так

FieldName.setCellValueFactory(() -> tableRows.getColumns().get(0).getText());
FieldValue.setCellValueFactory(() -> tableRows.getSelectionModel().getSelectedItem().get(0));


Но лично я не считаю это красивым.

как я понял, установка свойства заполнения в инициализации как раз и является эталонным способом бинда, согласно документации?

BlazkowiczНо, в идеале, нужно завести новый JavaFX объект, который будет строкой (item) в верхней таблице.
А свойства этого объекта уже прибиндить к tableView.selectionModel.selectedItem.yourDomainProperty

В идеале, наверное нужно создавать объект, конечно, но я подумал, что т.к. я могу кликать по разным строкам и перезаполнять таблицу, то в случае если бы я создавал динамичную колонку, например, это привело бы к бОльшей утечке памяти, чем в текущем варианте. Возможно, я ошибаюсь тут?

В итоге, черновой вариант, который работает примерно как я ожидал, выглядит вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        tableRows.getSelectionModel().selectedItemProperty().addListener(
                (observable, oldValue, newValue) -> {
                    if (newValue != null) {
                        FieldName.setCellValueFactory(cellData->new ReadOnlyStringWrapper(tableRows.getColumns().get(0).getText()));
                        FieldValue.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(tableRows.getSelectionModel().getSelectedItem().get(0)));

                        tempRow.add(tableRows.getColumns().get(0).getText());
                        tempRow.add(tableRows.getSelectionModel().getSelectedItem().get(0));
                        tablebyOneRow.getItems().add(FXCollections.observableArrayList(tempRow));
                        tempRow.clear();
                    }
                });
    }



он конечно заполняет только первую строку, для примера, но хоть работает
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / заполнение TableView таблички
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]