1 回答

TA貢獻1795條經驗 獲得超7個贊
在一個空行的原因雙擊使你打開最后選定的產品,因為你加入EventHandler到TableView。當您單擊 上的任意位置TableView(包括空行)時,將EventHandler調用 。您想要的是每行EventHandler檢查該行是否為空。此外,由于每個TableRow都有對其項目的引用,因此您不必使用TableView的選擇模型。下面是一個例子:
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
public class Controller {
@FXML
private TableView<Object> table; // Using <Object> for example
@FXML
private void initialize() {
EventHandler<MouseEvent> onClick = this::handleTableRowMouseClick;
table.setRowFactory(param -> {
TableRow<Object> row = new TableRow<>();
row.setOnMouseClicked(onClick);
return row;
});
}
private void handleTableRowMouseClick(MouseEvent event) {
if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) {
// We know it will be a TableRow<Object> since that is the only kind
// of object we added the EventHandler to.
@SuppressWarnings("unchecked")
TableRow<Object> row = (TableRow<Object>) event.getSource();
if (!row.isEmpty() && row.getItem() != null) {
displayItem(row.getItem());
event.consume();
}
}
}
private void displayItem(Object item) {
// This is where you'd put your code that opens the item in
// its own Stage.
}
}
在示例中,EventHandler與TableRow由rowFactory. 這是可以的,因為我們可以TableRow通過調用MouseEvent.getSource(). 我將事情分成更多的方法,以使代碼更具可讀性/可維護性。
該示例檢查鼠標按鈕是否為主按鈕。如果您不關心哪個按鈕被點擊了兩次,那么您可以簡單地刪除該檢查。
添加回答
舉報