我有一个使用一个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());
}
});
编辑事件处理程序,当我在拾色器更改颜色不会被调用,任何想法?
有没有需要访问的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表达式,但它应该工作以及。 全部博客帖子是在这里 。
我有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只是一个“动作事件”请求中访问(组合框,日期选择器,颜色拾取等。)
问候,
嗯,我调查了话题有点,因为我有同样的问题。 恐怕说JavaFX是刚刚无法使用。
我看了看其他人如何实现自己的细胞和密钥都使用的东西,用绳子可表示这一点。 现在,它总是与Java的方法:自己的Java的方式或者在雨中独自离开。 为JavaFX的文档是非常糟糕的时刻,所以我不得不尝试,直到它的工作原理。
所以:要触发editCommit
-event,你必须调用setContentDisplay(ContentDisplay. TEXT_ONLY)
中updateItem()
这工作得很好,如果要作为字符串来显示您的数据,但在这样的情况下,其中一个ColorPicker只是做这项工作完全失败。
或者,它可能是可以手动触发事件。 但你如何得到表的位置? 我不知道。
它像迈克尔·西蒙斯在OP上的评论称。 您需要在编辑模式 。 当创建自己的自定义单元格可以手动调用触发编辑模式startEdit();
从TableCell的内部。
例如,使用您控制的focusProperty:
cp.focusedProperty().addListener((observable, oldValue, newValue) -> {
if (newValue) {
startEdit();
}
});