javafx tableview如何获取我点击的行?

use*_*830 7 javafx

这是我的代码

// 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());
}
Run Code Online (Sandbox Code Playgroud)

1)如何从单击的单元格中获取行?

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

编辑:3)我以为我附上了活动 TableCell

TableCell cell = TableColumn.DEFAULT_CELL_FACTORY.call(p);
cell.setOnMouseClicked(dblclickDescription);
Run Code Online (Sandbox Code Playgroud)

但是当我测试时,

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
Run Code Online (Sandbox Code Playgroud)

有没有一种方式来获得TableCellMouseEvent

Jam*_*s_D 17

回答您的具体问题:

我怎样从单击的单元格到达行?

TableCell定义一个getTableRow()方法,返回TableRow.所以你可以做到

Object item = cell.getTableRow().getItem();
Run Code Online (Sandbox Code Playgroud)

它将为您提供表中的行项(即正确的元素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) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,两个lambda表达式,猜我真的需要快速学习它. (3认同)

小智 5

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

Object object =  table.getSelectionModel().selectedItemProperty().get();
int index = table.getSelectionModel().selectedIndexProperty().get();
Run Code Online (Sandbox Code Playgroud)

然后,您可以在索引/对象发生变化时添加监听器,如下所示:

table.getSelectionModel().selectedIndexProperty().addListener((num) -> function());
Run Code Online (Sandbox Code Playgroud)