java - ControlsFX 电子表格 View : How to set SpreadsheetCell to graphic only?

标签 java javafx controlsfx

我已经创建了自己的 SpreadsheetCellEditor 来显示 ColorPicker,但我不想返回 ColorPicker.getValue().toString,我想返回一个标签 所选值的背景颜色。我已经搜索了 setContentDisplay(ContentDisplay.GRAPHIC_ONLY) 但它似乎不存在于 SpreadsheetCell 上。 那么我怎样才能实现这一目标呢? 这是我到目前为止的实现,

public class comboboxCellEditor extends SpreadsheetCellEditor {
    private final ColorPicker colorPicker = new ColorPicker();
    private EventHandler<KeyEvent> eh;
    private ChangeListener<Color> cl;
    private boolean ending = false;

    public comboboxCellEditor(SpreadsheetView view) {
        super(view);

    }

    @Override
    public void startEdit(Object value) {
        if (value instanceof Color) {
            this.colorPicker.setValue((Color) value);
        }

        attachEnterEscapeEventHandler();
        this.colorPicker.show();
        this.colorPicker.requestFocus();

    }


    @Override
    public Control getEditor() {
        return colorPicker;
    }


    public String getControlValue() {

        return this.colorPicker.getValue().toString();

    }

    @Override
    public void end() {
        if (this.colorPicker.isShowing()) {
            this.colorPicker.hide();
        }

        this.colorPicker.removeEventFilter(KeyEvent.KEY_PRESSED, this.eh);
        this.colorPicker.valueProperty().removeListener(this.cl);
    }

    private void attachEnterEscapeEventHandler() {
        this.eh =
                new EventHandler<KeyEvent>() {
                    public void handle(KeyEvent t) {
                        if (t.getCode() == KeyCode.ENTER) {
                            comboboxCellEditor.this.ending = true;
                            comboboxCellEditor.this.endEdit(true);
                            comboboxCellEditor.this.ending = false;
                        } else if (t.getCode() == KeyCode.ESCAPE) {
                            comboboxCellEditor.this.endEdit(false);
                        }

                    }
                };
        this.colorPicker.addEventFilter(KeyEvent.KEY_PRESSED, this.eh);
        this.cl = new ChangeListener<Color>() {
            public void changed(ObservableValue<? extends Color> observable, Color oldValue, Color newValue) {
                if (!comboboxCellEditor.this.ending)
                    comboboxCellEditor.this.endEdit(true);

            }
        };
        this.colorPicker.valueProperty().addListener(this.cl);
    }

}

public class SpreadSheetComboboxCellType extends SpreadsheetCellType<Color> {
    @Override
    public SpreadsheetCellEditor createEditor(SpreadsheetView spreadsheetView) {
        return new comboboxCellEditor(spreadsheetView);
    }

    @Override
    public String toString(Color color) {
        return color.toString();
    }

    @Override
    public boolean match(Object o) {
        return true;

    }

    @Override
    public Color convertValue(Object o) {
        if (o instanceof Color)
            return (Color) o;
        else {
            return Color.valueOf((String) o);
        }
    }

    public SpreadsheetCell createCell(int row, int column, int rowSpan, int columnSpan, Color value) {
        SpreadsheetCellBase cell = new SpreadsheetCellBase(row, column, rowSpan, columnSpan, this);
        cell.setItem(value);
        Label label = new Label();
        label.setGraphic(null);
        label.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        cell.setGraphic(label);

        return cell;
    }

}

最佳答案

每次修改项目时,SpreadsheetCell 都有一个 updateText 方法。因此,它应该首先显示文本。

您有多种选择。

最简单的方法是向单元格添加监听器并修改此时的图形: 单元格中显示的文本将是 SpreadsheetCellType 转换的结果。由于您不需要文本,因此在 SpreadSheetComboboxCellType 中不返回任何内容:

@Override
public String toString(Color color) {
    return "";
}

然后只需在 SpreadsheetCell 上添加一个监听器并修改图形即可:

cell.itemProperty().addListener(new ChangeListener<Object>() {
        @Override
        public void changed(ObservableValue<? extends Object> ov, Object t, Object newValue) {

            if (newValue != null && newValue instanceof Color ) {
                //Do something
                cell.setGraphic(My_Graphic_Object);
            } else {
                cell.setGraphic(null);
            }
        }
    });

这应该可以解决问题。现在您可以实现自己的 SpreadsheetCell,以便完全控制显示。这样会更有效率。基本上复制 SpreadsheetCellBase 的所有代码(此处: https://bitbucket.org/controlsfx/controlsfx/src/755c59605e623476ff0a6c860e2c218488776aec/controlsfx/src/main/java/org/controlsfx/control/spreadsheet/SpreadsheetCellBase.java?at=default&fileviewer=file-view-default ) 只需修改 updateText 方法即可:

 private void updateText() {
    if(getItem() == null){
        text.setValue(""); //$NON-NLS-1$
    }else if (!("").equals(getFormat())) { //$NON-NLS-1$
        text.setValue(type.toString(getItem(), getFormat()));
    } else {
        text.setValue(type.toString(getItem()));
    }
}

您将使用新颜色修改图形,而不是修改文本。

关于java - ControlsFX 电子表格 View : How to set SpreadsheetCell to graphic only?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38021407/

相关文章:

java - 按顺序合并多个 pdf

java - 如何将复选框添加到表中以读取和写入它在 JavaFX 中表示的对象属性

javafx - 如何监听 CheckComboBox 的打开/关闭事件?

tabs - 像 Web 选项卡一样设置 Javafx 选项卡的样式

javafx - TableView:调整可见行数

java - 如何为 ControlsFX CustomTextField 自动完成下拉列表设置 OnClick 或 OnSelection?

java - 将评级值设置为文本框

java - 确定是从 GWT 应用程序还是常规 Java 使用库类

Java 不会从文件中读取 int

java - Java 库是否具有 C++ 中的 std::lower_bound() 、 std::upper_bound() 之类的函数?