2016-06-24 2 views
0

Я создал свой собственный SpreadsheetCellEditor, чтобы показать ColorPicker, но я не хочу возвращать ColorPicker.getValue().toString, я хочу вернуть ярлык с Цвет фона выбранного значения. Я искал setContentDisplay(ContentDisplay.GRAPHIC_ONLY), но, похоже, не существует в SpreadsheetCell. Итак, как я могу это достичь? Вот моя реализация до сих пор,ControlsFX SpreadsheetView: как установить таблицу электронных таблиц только на графику?

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

} 

ответ

1

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

Вместо изменения текста, вы бы модифицировать графику с новым цветом.

 Смежные вопросы

  • Нет связанных вопросов^_^