2015-05-11 66 views
0

将EventHander添加到TableCell的正确方法是什么?javaFX TableCell with event

起初我只用了两行

@FXML private TableColumn EANCol; 
... 
EANCol.setCellValueFactory(new PropertyValueFactory<MyRow, String>("EAN")); 

和一切工作,直到我试图添加事件

EventHandler eh = new EventHandler<MouseEvent>(){ 
    @Override 
    public void handle(MouseEvent mouseEvent) { 
     if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){ 
      if(mouseEvent.getClickCount() == 2){ 
       System.out.print("Double clicked "); 
       System.out.println(mouseEvent.getTarget().toString()); 
      } 
     } 
    } 
}; 

EANCol.setCellFactory(new Callback<TableColumn, TableCell>() { 
    @Override 
    public TableCell call(TableColumn p) { 
     TableCell cell = new TableCell(); 
     cell.setOnMouseClicked(eh); 
     return cell; 
    } 
}); 

问题:现在我可以双击它,但整个列空,值为null。

回答

1

使用默认构造函数创建的表格单元在其updateItem(...)方法中实际上不会执行任何操作以导致显示任何内容。在TableColumn中定义的DEFAULT_CELL_FACTORY表示产生“默认”表格单元的工厂(即,显示内容的字符串版本)。所以如果你想添加一个事件处理程序的默认行为,你可以这样做:

EANCol.setCellFactory(new Callback<TableColumn<?,?>, TableCell<?,?>>() { 
    @Override 
    public TableCell call(TableColumn<?,?> p) { 
     TableCell<?,?> cell = TableColumn.DEFAULT_CELL_FACTORY.call(p); 
     cell.setOnMouseClicked(eh); 
     return cell; 
    } 
}); 
+0

非常感谢你这么快速的回复。它现在有效 – user2760830