Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFXTableView如何获取我单击的行?_Javafx - Fatal编程技术网

JavaFXTableView如何获取我单击的行?

JavaFXTableView如何获取我单击的行?,javafx,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)){

这是我的密码

// 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());
}
但是当我测试的时候

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

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

Object object =  table.getSelectionModel().selectedItemProperty().get();
int index = table.getSelectionModel().selectedIndexProperty().get();
然后,当索引/对象发生如下更改时,可以添加侦听器:

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

要回答您的具体问题:

如何从单击的单元格中获取该行

TableCell
定义一个方法,返回
TableRow
。所以你可以

Object item = cell.getTableRow().getItem();
这将为您提供表中的行项目(即
table.getItems()
的正确元素)。如果愿意,您还可以从
table.getItems().get(cell.getIndex())
中获取

我是否可以将事件附加到整行而不是每列

对。定义
行工厂

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) {
    // ...
}
TableView table=newtableview();
表.setRowFactory(电视->{
TableRow行=新TableRow();
row.setOnMouseClicked(事件->{
如果(!row.isEmpty()&&event.getButton()==MouseButton.PRIMARY
&&event.getClickCount()==2){
MyDataType clickedRow=row.getItem();
打印行(单击显示);
}
});
返回行;
});
// ...
私有void打印行(MyDataType项){
// ...
}

“选择”在语义上与“单击单元格”不同。这种方法可能有效,但实际上有点脆弱。在调用单元格侦听器之前,如何知道选择状态将被更新。如果用户使用键盘更改选择,您真的希望执行该操作吗(此解决方案将如此):最初的问题只是关于鼠标单击单元格。此外,如果用户单击一行中的单元格,然后双击同一行中的另一个单元格,则不会触发更改侦听器…哇,两个lambda表达式,我想我真的需要快速学习。
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) {
    // ...
}