鉴于TableView,我需要检测单元格上的双击。
tableView.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
if(event.getClickCount()>1)
{
System.out.println("double clicked!");
}
}
});
如何确定单击鼠标的单元格?
答案 0 :(得分:29)
代码示例。
运行official tableview tutorial的“示例12-11:单元格编辑的替代解决方案”
替换以下内容:
table.setEditable(false);
Callback<TableColumn, TableCell> cellFactory =
new Callback<TableColumn, TableCell>() {
public TableCell call(TableColumn p) {
TableCell cell = new TableCell<Person, String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(empty ? null : getString());
setGraphic(null);
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
};
cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (event.getClickCount() > 1) {
System.out.println("double clicked!");
TableCell c = (TableCell) event.getSource();
System.out.println("Cell text: " + c.getText());
}
}
});
return cell;
}
};
无需EditingCell
,因为您的单元格无法编辑。单元工厂用于单元渲染。因此,可以使用单元格的setGraphics()方法放置除默认Labeled
之外的任何节点/控件。 IMO您无法直接访问默认单元格,因此您应该定义自己的单元工厂,以便能够在单元格上放置事件过滤器。
答案 1 :(得分:5)
JavaFX允许您为每个单元设置多个侦听器(我不是说这是好还是坏,只是你可以)。如果您将代码设置为对特定列/行的特定侦听器执行响应,则每个侦听器都将执行您的代码。要捕获单元格鼠标单击,我使用以下内容:
<ion-content class="has-subheader">
<ion-list>
<ion-item class="item-thumbnail-left item-text-wrap"
ng-repeat="item in MYRESULT "
href="#/tab/dash/{{item.U_ID}}">
<img ng-src="http://mydomain/Uimg/{{item.U_ID}}.jpg" />
</ion-item>
</ion-list>
</ion-content>
你可以从上面的代码中看到,在我希望基于鼠标点击做的事情的列上,我有代码:
table.setEditable(true);
table.getSelectionModel().setCellSelectionEnabled(true); // selects cell only, not the whole row
table.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent click) {
if (click.getClickCount() == 2) {
@SuppressWarnings("rawtypes")
TablePosition pos = table.getSelectionModel().getSelectedCells().get(0);
int row = pos.getRow();
int col = pos.getColumn();
@SuppressWarnings("rawtypes")
TableColumn column = pos.getTableColumn();
String val = column.getCellData(row).toString(); System.out.println("Selected Value, " + val + ", Column: " + col + ", Row: " + row);
if ( col == 2 ) { ... do something ... }
if ( col == 5 ) { ... do something ... }
if ( col == 6 ) { ... do something ... }
if ( col == 8 ) { ... do something ... }
}
}
});
我也将这些列设置为不允许编辑:
if ( col == <int> ) { ... do something ... }
我要编辑的行我有thisCol.setEditable(false);
但没有点击鼠标的响应。
单元格编辑默认为2次鼠标点击。您可以更改上面的代码以捕获单元格上的不同鼠标事件,这样您仍然可以通过2次鼠标单击编辑单元格,或打开URL,对话框等,以及由您确定的任何其他鼠标事件。 TableView允许您根据自己的想象力和编程技巧确定自己的功能。你并没有坚持使用&#34;我可以编辑它,或用它来发射鼠标事件。&#34;你可以做到两个:)
答案 2 :(得分:2)
在侦听器的正文中添加以下内容,T
表记录的类型:
@SuppressWarnings("rawtypes")
ObservableList<TablePosition> cells = tableView.getSelectionModel().getSelectedCells();
for( TablePosition< T, ? > cell : cells )
{
System.out.println( cell.getColumn());
}// for
答案 3 :(得分:1)
使用单元工厂创建单元格,并在创建单元节点的单元工厂中,在节点而不是tableView上放置鼠标事件处理程序或过滤器。
答案 4 :(得分:1)
在我的情况下,我使用下一个代码
tableViewObject.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
if (t.getClickCount() == 2 && getSelectedItem() != null) {
SMPBLogger.logInfo("Double cliked", Boolean.TRUE);
if (listener != null) {
listener.doubleClicked(tableViewObject.this,getSelectedItem());
}
}
}
});