javafx tableview 如何获取我点击的行?
javafx tableview how to get the row I clicked?
这是我的代码
// 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());
}
1) 如何从我点击的单元格转到该行?
2) 我可以将事件附加到整行而不是每一列吗?
编辑:
3) 我以为我在 TableCell
上附加了事件
TableCell cell = TableColumn.DEFAULT_CELL_FACTORY.call(p);
cell.setOnMouseClicked(dblclickDescription);
但是当我测试时,
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());
回答您的具体问题:
how do I get from the cell I clicked to the row?
TableCell
定义了一个getTableRow()
方法,返回TableRow
。所以你可以做
Object item = cell.getTableRow().getItem();
这将为您提供 table 中的行项目(即 table.getItems()
的正确元素)。如果您愿意,也可以从 table.getItems().get(cell.getIndex())
获取。
can I attach the event to the whole row instead of each column?
是的。定义一个 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) {
// ...
}
这是我的代码
// 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());
}
1) 如何从我点击的单元格转到该行?
2) 我可以将事件附加到整行而不是每一列吗?
编辑:
3) 我以为我在 TableCell
TableCell cell = TableColumn.DEFAULT_CELL_FACTORY.call(p);
cell.setOnMouseClicked(dblclickDescription);
但是当我测试时,
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());
回答您的具体问题:
how do I get from the cell I clicked to the row?
TableCell
定义了一个getTableRow()
方法,返回TableRow
。所以你可以做
Object item = cell.getTableRow().getItem();
这将为您提供 table 中的行项目(即 table.getItems()
的正确元素)。如果您愿意,也可以从 table.getItems().get(cell.getIndex())
获取。
can I attach the event to the whole row instead of each column?
是的。定义一个 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) {
// ...
}