如何在JavaFX TableView中选择TableCell

时间:2014-02-24 13:02:14

标签: javafx javafx-8

我正在寻找一种方法来获取TableView控件的选定单元格。请注意,我不只是想要单元格值,我想要一个实际的TableCell对象。人们会期望这个方法:

tableView.getSelectionModel().getSelectedCells().get(0)

就是这样,但是它返回一个TablePosition对象,它给出了行和列信息,但我没有看到从中获取TableCell对象的方法。

我需要这个的原因是因为我想响应按键,但是将事件过滤器附加到TableCell不起作用(可能因为它不可编辑)。所以我将它附加到TableView,但后来我需要获取当前选中的单元格。

编辑:对于未来的读者:除了在细胞工厂外,不要乱用TableCell对象。按照设计师的意图使用TableView,否则您将遇到很多麻烦。如果您需要单个表中来自多个源的数据,最好创建一个聚合所有数据的新类,并将其用作TableView源。

3 个答案:

答案 0 :(得分:4)

我刚刚发布了一个使用此代码编辑Cell的答案。我不认为你可以获得对实际表格单元格的引用,因为它是表格视图的内部。

tp = tv.getFocusModel().getFocusedCell();
tv.edit(tp.getRow(), tp.getTableColumn());

您的方法也会返回一个TablePosition,因此您也可以使用它。

这是链接https://stackoverflow.com/a/21988562/2855515

答案 1 :(得分:0)

这可能会被否决,因为 OP 询问返回单元本身,而不是我将描述的内容,但 Google 搜索将我带到这里解决我的问题。

我个人在尝试从单个单元格中检索数据时遇到了问题。

java.is.for.desktop 提供了与此事相关的错误代码,该代码会引发 ArrayIndexOutOfBoundsException,但处于正确的轨道上。我的目标是提供一个使用 lambda 的更好示例。

从单个 TableCell 访问数据:

tableView.getFocusModel().focusedCellProperty().addListener((ObservableValue<? extends TablePosition> observable, TablePosition oldPos, TablePosition pos) -> {
    int    row           = pos.getRow();
    int    column        = pos.getColumn();
    String selectedValue = "";

    /* pos.getColumn() can return -1 if the TableView or
     * TableColumn instances are null. The JavaDocs state
     * this clearly. Failing to check will produce an 
     * ArrayIndexOutOfBoundsException when underlying data is changed.
     */
    if ((pos.getRow() != -1) && (pos.getColumn() != -1))
    {
        selectedValue = tableView.getItems()
                                          .get(row)
                                          .get(column);

        if ((selectedValue != null) && (!selectedValue.isEmpty()))
        {
            // handling if contains data
        }
        else
        {
            // handling if doesn't contain data
        }
    }
});

编辑: 我的意思是说 ArrayIndexOutOfBoundsException,而不是 NullPointerException,我更新了这个答案以反映这一点。我还清理了拼写和语法。

答案 2 :(得分:-1)

您想要回应按键吗?最好不要。

相反,您可以注册一个监听器来聚焦表格单元格,这可以使用箭头键和鼠标点击表格单元格(甚至可以使用触摸事件,哦,我的,未来已经存在)

$("#comq").click (function my(e) {

在这个例子中,我正在使用&#34; classic&#34;以table.getFocusModel().focusedCellProperty().addListener( new ChangeListener<TablePosition>() { @Override public void changed(ObservableValue<? extends TablePosition> observable, TablePosition oldPos, TablePosition pos) { int row = pos.getRow(); int column = pos.getColumn(); String selectedValue = ""; if (table.getItems().size() > row && table.getItems().get(row).size() > column) { selectedValue = table.getItems().get(row).get(column); } label.setText(selectedValue); } }); 为列模型的TableView。 (所以,你的数据类型可能与String不同。)当然,List<String>只是我代码中的一个例子。