6

我有一个 TableView,它使用 ColorPicker 来(显示/编辑)单元格中的颜色。该表在所需字段中显示颜色选择器,但编辑不起作用。

TableColumn<SeriesPreferences, Color> c2 = new TableColumn<SeriesPreferences, Color>("Color");
c2.setCellValueFactory(new PropertyValueFactory<SeriesPreferences, Color>("color"));
c2.setCellFactory(new Callback<TableColumn<SeriesPreferences, Color>,
                                TableCell<SeriesPreferences, Color>>()
    {
        @Override
        public TableCell<SeriesPreferences, Color> 
        call(final TableColumn<SeriesPreferences, Color> param)
        {
            TableCell<SeriesPreferences, Color> cell = 
                new TableCell<SeriesPreferences, Color>()
                    {
                        @Override
                        public void updateItem(Color c, boolean empty)
                        {
                            if(c != null)
                            {
                                final ColorPicker cp = new ColorPicker();
                                cp.setValue(c);
                                setGraphic(cp);
                                cp.setOnAction(new EventHandler<javafx.event.ActionEvent>()
                                    {
                                        public void 
                                        handle(javafx.event.ActionEvent t)
                                        {
                                            getTableView().edit(getTableRow().getIndex(), param);
                                            commitEdit(cp.getValue());
                                        }
                                    });
                            }
                        }
                    };
            return cell;
        }
    });

c2.setOnEditCommit(new EventHandler<CellEditEvent<SeriesPreferences, Color>>()
    {
        @Override
        public void handle(CellEditEvent<SeriesPreferences, Color> t)
        {
            ((SeriesPreferences) t.getTableView().getItems().get(t.getTablePosition().
                                                    getRow())).setColor(t.getNewValue());
        }
    });

当我更改颜色选择器中的颜色时,没有调用编辑事件处理程序,有什么想法吗?

4

4 回答 4

2

如果 JavaFX POJO(或 JavaFX Bean)的属性正确绑定到表,则无需直接访问 JavaFX POJO(或 JavaFX Bean),也无需调用除 commitEdit 之外的任何内容。

Max Beikirch 的回答具有误导性,因为当表格不处于编辑模式时,它会导致颜色选择器(以及颜色)消失。将表格置于编辑模式是一种解决方法,但这是一种糟糕的解决方法。因此,请在单击按钮时显示颜色选择器弹出窗口之前执行此操作:

使用这样的颜色选择器编写您的单元格:

public class ColorTableCell<T> extends TableCell<T, Color> {    
    private final ColorPicker colorPicker;

    public ColorTableCell(TableColumn<T, Color> column) {
        this.colorPicker = new ColorPicker();
        this.colorPicker.editableProperty().bind(column.editableProperty());
        this.colorPicker.disableProperty().bind(column.editableProperty().not());
        this.colorPicker.setOnShowing(event -> {
            final TableView<T> tableView = getTableView();
            tableView.getSelectionModel().select(getTableRow().getIndex());
            tableView.edit(tableView.getSelectionModel().getSelectedIndex(), column);       
        });
        this.colorPicker.valueProperty().addListener((observable, oldValue, newValue) -> {
            if(isEditing()) {
                commitEdit(newValue);
            }
        });     
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    }

    @Override
    protected void updateItem(Color item, boolean empty) {
        super.updateItem(item, empty);  

        setText(null);  
        if(empty) {     
            setGraphic(null);
        } else {        
            this.colorPicker.setValue(item);
            this.setGraphic(this.colorPicker);
        } 
    }
}

如果您使用的是 Java 7,请将 lambdas 替换为匿名内部类,但它应该也可以工作。完整的博客文章在这里

于 2014-10-27T11:20:25.900 回答
1

我对 CheckBoxTableCell 和 DatePickerTableCell 和 ColorPickerTableCells 有同样的问题 :-(

我是这样处理的:在控件的事件上,我取回“ ((Inputs)getTableView().getItems().get(getTableRow().getIndex() ”使用的 POJO 对象,并且我更新类似是否在 OnEditCommit 方法中完成...

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

 ((Inputs) getTableView().getItems().get(
                    getTableRow().getIndex())
                    ).setColor(cp.getValue());

这是 ColorPickerCell 的示例:

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

使用这个简单的 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);
}

我不知道这是否是实现这一目标的好方法,但它对我有用......请注意,JavaFX 的 POJO 只能在“ActionEvent”请求(组合框、日期选择器、颜色选择器等)中访问。

问候,

于 2014-04-10T17:58:44.713 回答
1

好吧,我对这个话题进行了一些调查,因为我遇到了同样的问题。恐怕JavaFX 是无法使用的。

我看了一下其他人是如何实现他们的单元的,关键是它们都使用了可以用字符串表示的东西。现在,这就是 Java 的一贯方式:以 Java 的方式去做,或者在雨中独自一人。JavaFX 的文档目前非常糟糕,所以我不得不尝试直到它起作用。

所以:要触发-event ,editCommit你必须调用setContentDisplay(ContentDisplay. TEXT_ONLY). updateItem()如果想将数据显示为字符串,那效果很好,但在这种情况下完全失败,颜色选择器只是完成这项工作。

或者,也可以手动触发事件。但是你如何获得桌面位置?我不知道。

于 2013-07-08T13:09:05.560 回答
0

就像迈克尔西蒙斯在对 OP 的评论中所说的那样。您需要处于编辑模式。创建您自己的自定义单元格时,您可以通过startEdit();从 TableCell 内部调用来手动触发编辑模式。

例如使用您的控件的 focusProperty:

    cp.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if (newValue) {
            startEdit();
        }
    });
于 2014-12-08T17:23:03.027 回答