javafx tableview oneditcommit未通过自定义cellfactory调用?

javafx tableview oneditcommit未通过自定义cellfactory调用?,java,events,javafx,tableview,tablecell,Java,Events,Javafx,Tableview,Tablecell,请查看以下工作代码: class MyType{ SimpleStringProperty myname; SimpleObjectProperty<Color> mycolor; } TableColumn col; arr = FXCollections.observableArrayList(new ArrayList<MyType>()); tblColName.setCellValueFact

请查看以下工作代码:

    class MyType{
       SimpleStringProperty myname;
       SimpleObjectProperty<Color> mycolor;
    }

    TableColumn col;
    arr = FXCollections.observableArrayList(new ArrayList<MyType>());
    tblColName.setCellValueFactory(new PropertyValueFactory("myname"));
    // Use the cell-factory provided by TextFieldTableCell.
    tblColName.setCellFactory(TextFieldTableCell.forTableColumn());
    tblColName.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent>() {
        @Override
        public void handle(TableColumn.CellEditEvent cellEditEvent) {
            ((MyType) cellEditEvent.getRowValue()).myname.set((String) cellEditEvent.getNewValue());
        }
    });
}

上面的代码有点变化

    TableColumn col;
    arr = FXCollections.observableArrayList(new ArrayList<MyType>());
    tblColName.setCellValueFactory(new PropertyValueFactory("myname"));
    // Use the cell-factory provided by TextFieldTableCell.
    tblColName.setCellFactory(ColorPickerTableCell.forTableColumn());
    tblColName.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent>() {
        @Override
        public void handle(TableColumn.CellEditEvent cellEditEvent) {
            throw new NotImplementedException(); // is never thrown.
        }
    });
tablecol;
arr=FXCollections.observearraylist(新的ArrayList());
tblColName.setCellValueFactory(新的PropertyValueFactory(“myname”));
//使用TextFieldTableCell提供的单元格工厂。
tblColName.setCellFactory(ColorPickerTableCell.forTableColumn());
tblColName.setOnEditCommit(新的EventHandler(){
@凌驾
公共无效句柄(TableColumn.CellEditEvent CellEditEvent){
抛出新的NotImplementedException();//从未抛出。
}
});

。。。使代码不再工作。永远不会抛出异常。我认为我在设计
ColorPickerTableCell
时犯了一些错误,但我无法想象会发生什么。如何让JavaFX调用我的
OnEditCommit

我最近遇到了同样的问题。不幸的是,我还没有找到任何方法从
ColorPicker
控件触发该事件。但是,我提出了以下解决方法

首先,我创建了一个颜色包装类:

public class ColorWrapper {

 private Color color;

 ....
}
我用模型类
M
中的包装器实例替换了
Color
实例。接下来,我以以下方式实现了
setCellFactory
方法:

myColumn.setCellFactory(new Callback<TableColumn<M, ColorWrapper>, TableCell<M, ColorWrapper>>() {          

        @Override
        public TableCell<M, ColorWrapper> call(TableColumn<M,ColorWrapper> arg0) {
            return new TableCell<M, ColorWrapper>(){

                private ColorPicker colorPicker;

                private ColorPicker createPicker(){
                    colorPicker = new ColorPicker();

                    colorPicker.setOnAction(new EventHandler<ActionEvent>() {
                        @Override
                        public void handle(ActionEvent evt) {
                            ColorPicker cp = (ColorPicker)evt.getSource();
                            ColorWrapper cw = (ColorWrapper)cp.getUserData();
                            cw.setColor(cp.getValue());
                        }

                    });
                    return colorPicker;
                }


                @Override
                protected void updateItem(ColorWrapper value, boolean empty) {                      
                    super.updateItem(value, empty);
                    if(empty){
                        return;
                    }

                    if(colorPicker == null){
                        colorPicker = createPicker();
                        colorPicker.setUserData(value);
                    }

                    colorPicker.setValue(value.getColor());
                    setGraphic(colorPicker);
                }

            };

        }            

    });
myColumn.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn arg0){
返回新的TableCell(){
私人色彩采集器;
专用颜色选择器createPicker(){
colorPicker=新的colorPicker();
colorPicker.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent evt){
ColorPicker cp=(ColorPicker)evt.getSource();
ColorWrapper cw=(ColorWrapper)cp.getUserData();
cw.setColor(cp.getValue());
}
});
返回颜色选择器;
}
@凌驾
受保护的void updateItem(ColorWrapper值,布尔空){
super.updateItem(值,空);
if(空){
返回;
}
if(colorPicker==null){
colorPicker=createPicker();
colorPicker.setUserData(值);
}
colorPicker.setValue(value.getColor());
设置图形(颜色选择器);
}
};
}            
});

如您所见,我刚刚使用了
ColorPicker
类的
setUserData/getUserData
方法,就是这样。它可以工作。

对于CheckBoxTableCell和DatePickerTableCell以及ColorPickerTableCells,我遇到了同样的问题:-(

我是这样处理的:在控件的事件上,我得到“((输入)getTableView().getItems().get(getTableRow().getIndex()”正在使用的POJO对象,并且我像在OnEditCommit方法中一样进行更新

所以对我来说,它看起来像这样(更新颜色):

下面是ColorPickerCell的示例 :

公共类ColorPickerTableCell扩展了TableCell{
私人色彩采集器;
公共ColorPickerTableCell(){
cp=新的颜色选择器();
cp.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
committedit(cp.getValue());
updateItem(cp.getValue(),isEmpty());
((输入)getTableView().getItems().get(
getTableRow().getIndex())
).setColor(cp.getValue());
}            
});                
设置图形(cp);
setContentDisplay(仅限ContentDisplay.GRAPHIC_);
可编辑设置(真);
}     
@凌驾
受保护的void updateItem(颜色项,布尔值为空){
super.updateItem(项,空);
cp.setVisible(!空);
本.setItem(item);
cp.setValue(项目);
}
}
使用这个简单的JavaFX的POJO:

    public ObjectProperty<Color> color = new SimpleObjectProperty<Color>();

    this.color = new SimpleObjectProperty(color);

    public ObjectProperty<Color> colorProperty() {
    return color;
 }

public void setColor(Color color2) {
    color.set(color2);
}
public ObjectProperty color=new SimpleObjectProperty();
this.color=新的SimpleObject属性(颜色);
公共对象属性colorProperty(){
返回颜色;
}
公共空间设置颜色(颜色2){
颜色。设置(颜色2);
}
我不知道这是否是一个实现这一点的好方法,但它对我很有效……请注意,JavaFX的POJO只能在“ActionEvent”请求(combobox、datepicker、colorpicker等)中访问


关于,

您首先需要使用statEdit()进入编辑状态;如果您现在提交一个事件,它将被触发

为了详细说明justcode的答案,下面是我遇到问题并解决问题的班级:

public class DeleteButtonCell extends TableCell<Menu, Menu> {

  private Button deleteButton;

  public DeleteButtonCell() {
    deleteButton = new Button();
    deleteButton.setId("trash-button");
    deleteButton.setOnAction((e) -> {
      startEdit();
      commitEdit((Menu) this.getTableView().getItems().get(this.getIndex()));
    });
  }

  @Override
  protected void updateItem(Menu t, boolean empty) {
    super.updateItem(t, empty);
    if (empty) {
      setGraphic(null);
    } else {
      setGraphic(deleteButton);
    }
  }

}
公共类DeleteButtonCell扩展了TableCell{
私人按钮删除按钮;
公共DeleteButtonCell(){
deleteButton=新按钮();
deleteButton.setId(“垃圾按钮”);
deleteButton.setOnAction((e)->{
startEdit();
committedit((菜单)this.getTableView().getItems().get(this.getIndex());
});
}
@凌驾
受保护的void updateItem(菜单t,布尔空){
super.updateItem(t,空);
if(空){
设置图形(空);
}否则{
设置图形(删除按钮);
}
}
}

这里可能重复了这一点,但这一点也没有解决:
public class ColorPickerTableCell<Inputs> extends TableCell<Inputs, Color>{
private ColorPicker cp;

public ColorPickerTableCell(){        
    cp = new ColorPicker(); 
    cp.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            commitEdit(cp.getValue());
            updateItem(cp.getValue(), isEmpty());
            ((Inputs) getTableView().getItems().get(
                    getTableRow().getIndex())
                    ).setColor(cp.getValue());
        }            
    });                
    setGraphic(cp);
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    setEditable(true);        
}     
@Override
protected void updateItem(Color item, boolean empty) {
    super.updateItem(item, empty);
    cp.setVisible(!empty);
    this.setItem(item);
    cp.setValue(item);
}
}
    public ObjectProperty<Color> color = new SimpleObjectProperty<Color>();

    this.color = new SimpleObjectProperty(color);

    public ObjectProperty<Color> colorProperty() {
    return color;
 }

public void setColor(Color color2) {
    color.set(color2);
}
public class DeleteButtonCell extends TableCell<Menu, Menu> {

  private Button deleteButton;

  public DeleteButtonCell() {
    deleteButton = new Button();
    deleteButton.setId("trash-button");
    deleteButton.setOnAction((e) -> {
      startEdit();
      commitEdit((Menu) this.getTableView().getItems().get(this.getIndex()));
    });
  }

  @Override
  protected void updateItem(Menu t, boolean empty) {
    super.updateItem(t, empty);
    if (empty) {
      setGraphic(null);
    } else {
      setGraphic(deleteButton);
    }
  }

}