javafx tableview oneditcommit 不会被自定义 cellfactory 调用?

标签 java events javafx tableview tablecell

看看下面的工作代码:

    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());
        }
    });

但是,一旦我使用自定义 TableCell,就不再调用 setOnEditCommit 中的代码:

public class ColorPickerTableCell<S> extends TableCell<S, Color>{
private ColorPicker cp;

public ColorPickerTableCell(){        
    cp = new ColorPicker(Color.BLACK);        
    cp.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            commitEdit(cp.getValue());
            updateItem(cp.getValue(), isEmpty());
        }            
    });                
    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);
}

public static <T> Callback<TableColumn<Color, T>, TableCell<Color, T>> forTableColumn(){
    return new Callback<TableColumn<Color, T>, TableCell<Color, T>>() {
        @Override
        public TableCell<Color, T> call(TableColumn<Color, T> colorTTableColumn) {
            return new ColorPickerTableCell();
        }
    };

}

对上面的代码稍作改动...

    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.
        }
    });

... 使代码不再有效。永远不会抛出异常。我认为我在 ColorPickerTableCell 的设计中做错了什么,但我无法想象是什么。如何让 JavaFX 调用我的 OnEditCommit

最佳答案

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

关于javafx tableview oneditcommit 不会被自定义 cellfactory 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17473249/

相关文章:

java - 如何在java中服务器端获取<select>的值

java.lang.ClassNotFoundException : com. google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier$Builder

c++ - 为什么 WindowStateChange 事件对我不起作用

c# - 如何从外部为 UserControl 内的控件分配事件处理程序?

JavaFX TreeView 为空

java - 如何轮换来自同一台机器的每个请求的IP地址

java - JPA 删除的实体在 JoinColumn 上重新创建实体

javascript - HTML 如果我按 Tab 键,焦点接下来会去哪里?

java - JavaFX 颜色选择器的语言

listview - 如何在javafx中向ListView的单元格添加鼠标双击事件监听器?