JavaFX 9 - вставка потоковой панели ниже строки в зависимости от нажатой ячейки таблицы, часть 2

Я пытаюсь реализовать TableView, содержащий 2 столбца. Каждая ячейка таблицы содержит разные данные игрока. После того, как игрок нажал, под строкой, в которой находится игрок, отображается пользовательская FlowPane, содержащая данные, соответствующие выбранному игроку. Используя код James_D, который ответил на мой предыдущий вопрос:

JavaFx - String и FlowPane (row?) Внутри tableView?

Мне удалось заставить FlowPane появляться в нужном месте с помощью пользовательского TableRowFactory(skin):

До:

Перед нажатием

После нажатия на игрока (bg player 0 или 1, значение не имеет - выбран весь ряд):

После нажатия

Однако, хотя это правда, что мне нужно, чтобы FlowPane визуально находился ниже выбранной строки, FlowPane зависит от фактической отдельной ячейки, которая была нажата, а не от строки, которая была нажата. В частности, если я щелкаю ячейку в строке, вызывая отображение FlowPane, а затем щелкаю другую ячейку в той же строке, FlowPane должна изменить свои данные, чтобы отразить самый новый щелчок. Если снова нажать на тот же плеер, FlowPane должен исчезнуть. Кроме того, выбор ячейки не должен выделять всю строку, и FlowPane не должен быть окрашен (синий или любой другой цвет) из-за выбора... Но имя игрока должно быть!

Мне трудно реализовать это. Я думаю, что мне нужно:

table.getSelectionModel().setCellSelectionEnabled(true);

Это позволяет для индивидуального выбора ячейки. Но включение этого отключает слушателей TableRowSkin, делая весь код бессмысленным. Я попробовал обходной путь: приведенный ниже код может получить необходимую строку / столбец TablePosition, прослушивая изменения в списке selectedCells. Отлично, но я не знаю, как поступить. Какой смысл положения строк / столбцов, если я не могу получить доступ к потоковой панели TableCell или даже самой ячейке? Мне кажется, что единственное, к чему я могу получить доступ - это строка (свойство), содержащаяся в ячейке. Это полезно, но я сомневаюсь, что я должен выполнить getItems(), а затем выполнить итерацию по ним, чтобы увидеть, какой именно Player был выбран, а затем каким-то образом обновить flowPane.

ObservableList<TablePosition> selectedCells = table.getSelectionModel().getSelectedCells();
        selectedCells.addListener((ListChangeListener.Change<? extends TablePosition> change) ->
        {
            if (selectedCells.size() > 0)
            {
                TablePosition selectedCell = selectedCells.get(0);
                TableColumn column = selectedCell.getTableColumn();
                int rowIndex = selectedCell.getRow();

                //now adjust row/flowpane somehow
            }
        }); 

В псевдокоде все, что я хочу сделать, это:

Cell playerClicked = mouseEvent.clickedCell();
int i = mouseEvent.getChildren().getClickedIndex();
String name = playerClicked.getName();

PlayerData data = dataset.getItem(name);
FlowPane flow = new CustomFlowPane(data);

if(i % 2 == 0) //even table position: FlowPane should show up after the second column's position
    table.getChildren().add(i+2, flow);
else
    table.getChildren().add(i+1,flow);

Кто-нибудь может указать мне правильное направление? Пожалуйста, смотрите (вверху) ссылку на код James_D. Если бы вы могли помочь мне заставить его работать там, это было бы удивительно:)

0 ответов

Другие вопросы по тегам