我正在寻找一种方法来获取TableView控件的选定单元格。请注意,我不只是想要单元格值,我想要一个实际的TableCell对象。人们会期望这个方法:
tableView.getSelectionModel().getSelectedCells().get(0)
就是这样,但是它返回一个TablePosition对象,它给出了行和列信息,但我没有看到从中获取TableCell对象的方法。
我需要这个的原因是因为我想响应按键,但是将事件过滤器附加到TableCell不起作用(可能因为它不可编辑)。所以我将它附加到TableView,但后来我需要获取当前选中的单元格。
编辑:对于未来的读者:除了在细胞工厂外,不要乱用TableCell对象。按照设计师的意图使用TableView,否则您将遇到很多麻烦。如果您需要单个表中来自多个源的数据,最好创建一个聚合所有数据的新类,并将其用作TableView源。
答案 0 :(得分:4)
我刚刚发布了一个使用此代码编辑Cell的答案。我不认为你可以获得对实际表格单元格的引用,因为它是表格视图的内部。
tp = tv.getFocusModel().getFocusedCell();
tv.edit(tp.getRow(), tp.getTableColumn());
您的方法也会返回一个TablePosition,因此您也可以使用它。
答案 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>
只是我代码中的一个例子。