JavaFX TableView如何获取我所单击的行?

13

这是我的代码

// this event is attached to TableCell
public EventHandler dblclickDescription = new EventHandler<MouseEvent>(){
    @Override
    public void handle(MouseEvent event) {
        if(event.getButton().equals(MouseButton.PRIMARY)){
            if(event.getClickCount() == 2){
                printRow(event.getTarget());
            }
        }
        event.consume();
    }
};

// print row
public void printRow(Object o){
    Text text = (Text) o;

    // ??? don't know what to write here

   System.out.println(row.toString());
}

1) 我如何从我点击的单元格到达整行?

2) 我可以将事件附加到整行而不是每个列吗?

编辑: 3) 我认为我在TableCell上附加了事件。

TableCell cell = TableColumn.DEFAULT_CELL_FACTORY.call(p);
cell.setOnMouseClicked(dblclickDescription);

但是当我进行测试时,

event.getSource();// is a TableColumn
event.getTarget();// is a Text if clicked on text
event.getTarget();// is a TableColumn if clicked on empty space, even if that cell has text

有没有一种方法可以从 MouseEvent 中获取 TableCell
2个回答

24
回答您的具体问题:
如何从我点击的单元格跳转到行? TableCell定义了一个 getTableRow() 方法,返回TableRow。因此,您可以执行以下操作:
Object item = cell.getTableRow().getItem();

这将为您提供来自表格的行元素(即 table.getItems() 的正确元素)。如果您喜欢,也可以从 table.getItems().get(cell.getIndex()) 获取此内容。

是的。定义一个 rowFactory

TableView<MyDataType> table = new TableView<>();

table.setRowFactory(tv -> {
    TableRow<MyDataType> row = new TableRow<>();
    row.setOnMouseClicked(event -> {
        if (! row.isEmpty() && event.getButton()==MouseButton.PRIMARY 
             && event.getClickCount() == 2) {

            MyDataType clickedRow = row.getItem();
            printRow(clickedRow);
        }
    });
    return row ;
});

// ...

private void printRow(MyDataType item) {
    // ...
}

3
哇,两个 Lambda 表达式,看来我真的需要快速学习它。 - hanbin615

5
要获取行索引或选定项的索引,请使用以下代码:

Object object =  table.getSelectionModel().selectedItemProperty().get();
int index = table.getSelectionModel().selectedIndexProperty().get();

然后,您可以像这样添加一个侦听器,以便在索引/对象更改时触发:

table.getSelectionModel().selectedIndexProperty().addListener((num) -> function());

“选择”在语义上与“单击单元格”不同。这种方法可能有效,但它确实有点脆弱。您如何知道选择状态将在调用单元格侦听器之前更新?如果用户使用键盘更改选择(使用此解决方案),您真的希望执行操作吗?原始问题仅涉及鼠标单击单元格。 - James_D
此外,如果用户单击一行中的一个单元格,然后双击同一行中的另一个单元格,则更改监听器不会被触发... - James_D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接