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(). 我将事情分成更多的方法,以使代码更具可读性/可维护性。
该示例检查鼠标按钮是否为主按钮。如果您不关心哪个按钮被点击了两次,那么您可以简单地删除该检查。
添加回答
举报