0

我正在尝试实现一个包含 2 列的 TableView。每个表格单元格包含不同玩家的数据。单击玩家后,包含与单击的玩家对应的数据的自定义 FlowPane 将显示在玩家所在的行下方。使用 James_D 的代码回答了我之前的问题:

JavaFx - tableView 中的字符串和 FlowPane(行?)?

我已经设法使用自定义 TableRowFactory(skin) 使 FlowPane 出现在所需的位置:

前:

点击之前

单击一个玩家后(bg player 0 或 1,没关系 - 选择了整行):

点击后

但是,虽然我确实需要在所选行下方直观地显示 FlowPane,但 FlowPane 取决于单击的实际单个单元格 - 而不是单击的行。具体来说,如果我单击一行中的一个单元格,导致 FlowPane 出现,然后单击同一行中的另一个单元格,FlowPane 应该更改其数据以反映最新的点击。如果再次单击同一玩家,FlowPane 应该会消失。此外,选择一个单元格不应该选择整行,并且 FlowPane 不应该因为选择而被着色(蓝色或任何其他颜色)......但是玩家的名字应该是!

我很难实现这一点。我想我需要:

table.getSelectionModel().setCellSelectionEnabled(true);

这允许单独的单元格选择。但是启用它会禁用 TableRowSkin 的侦听器,从而使整个代码变得毫无意义。我尝试了一种解决方法:下面的代码可以通过监听 selectedCells 列表的更改来获取所需的行/列 TablePosition。太好了 - 但我不知道如何进行。如果我无法访问 TableCell 的流程窗格,甚至无法访问 Cell 本身,那么行/列位置的意义何在?我似乎唯一能够访问的是单元格包含的(属性)字符串。这很有用,但我怀疑我是否应该执行 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 代码的链接。如果你能帮我让它在那里工作,那就太棒了:)

4

0 回答 0