JavaFX 9 - 根据点击的表格单元格,在行下面插入流程图,第2部分

时间:2018-03-13 19:03:44

标签: javafx tableview javafx-9

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

JavaFx - String and FlowPane (row?) within tableView?

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

在:

Before clicking

点击播放器后(bg播放器0或1,无关紧要 - 选择整行):

After clicking

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

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

table.getSelectionModel().setCellSelectionEnabled(true);

这允许单个细胞选择。但启用会禁用TableRowSkin的侦听器,使整个代码无意义。我尝试了一种解决方法:下面的代码可以通过监听selectedCells列表的更改来获取所需的行/列TablePosition。很棒 - 但我不知道如何继续。如果我无法访问TableCell的流程窗格,甚至是Cell本身,那么行/列位置的重点是什么?我似乎唯一能够访问的是单元格包含的String的属性。这很有用,但我怀疑我是否应该使用getItems()然后遍历它们以查看实际选择了哪个底层播放器,然后以某种方式更新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 个答案:

没有答案