2016-06-24 29 views
0

我已经创建了自己的SpreadsheetCellEditor以显示ColorPicker,但我不想返回ColorPicker.getValue().toString,我想返回带有 的标签的背景色。我已经搜索了setContentDisplay(ContentDisplay.GRAPHIC_ONLY),但它似乎不存在于SpreadsheetCell上。 那我怎么能做到这一点? 这里是我的实现,到目前为止,ControlsFX SpreadsheetView:如何将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; 
    } 

} 

回答

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

不是修改文字,你会修改与新的颜色图形。

相关问题