JavaFX的实现代码如下用颜色拾取编辑器(JavaFX tableview with colorp

2019-09-21 20:43发布

我有一个使用一个ColorPicker到(显示/编辑)的颜色在细胞中的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());
        }
    });

编辑事件处理程序,当我在拾色器更改颜色不会被调用,任何想法?

Answer 1:

有没有需要访问的JavaFX POJO(或JavaFX的Bean)的直接如果属性正确绑定表,也没有必要打电话比其他commitEdit的东西。

从最大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中,用匿名内部类取代lambda表达式,但它应该工作以及。 全部博客帖子是在这里 。



Answer 2:

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

我对付它像:在控件的事件,我回去使用的POJO对象由我更新与之相似,如“((输入)getTableView()getItems()获取(getTableRow()getIndex()。”它是在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只是一个“动作事件”请求中访问(组合框,日期选择器,颜色拾取等。)

问候,



Answer 3:

嗯,我调查了话题有点,因为我有同样的问题。 恐怕说JavaFX是刚刚无法使用。

我看了看其他人如何实现自己的细胞和密钥都使用的东西,用绳子可表示这一点。 现在,它总是与Java的方法:自己的Java的方式或者在雨中独自离开。 为JavaFX的文档是非常糟糕的时刻,所以我不得不尝试,直到它的工作原理。

所以:要触发editCommit -event,你必须调用setContentDisplay(ContentDisplay. TEXT_ONLY)updateItem() 这工作得很好,如果要作为字符串来显示您的数据,但在这样的情况下,其中一个ColorPicker只是做这项工作完全失败。

或者,它可能是可以手动触发事件。 但你如何得到表的位置? 我不知道。



Answer 4:

它像迈克尔·西蒙斯在OP上的评论称。 您需要在编辑模式 。 当创建自己的自定义单元格可以手动调用触发编辑模式startEdit(); 从TableCell的内部。

例如,使用您控制的focusProperty:

    cp.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if (newValue) {
            startEdit();
        }
    });


文章来源: JavaFX tableview with colorpicker editor
标签: java javafx-2