我正在尝试实现包含2列的TableView。每个表格单元格包含不同的玩家数据。单击一个玩家后,包含与所点击的玩家相对应的数据的自定义FlowPane将显示在玩家所在的行下方。使用James_D的代码回答了我之前的问题:
JavaFx - String and FlowPane (row?) within tableView?
我设法使用自定义TableRowFactory(皮肤)使FlowPane出现在所需的位置:
在:
点击播放器后(bg播放器0或1,无关紧要 - 选择整行):
然而,虽然我确实需要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的代码链接。如果你能帮助我在那里工作,那将是惊人的:)