当TableCellEditor设置新值时,TableCellRenderer不会更改值

时间:2014-07-09 13:13:05

标签: java swing jtable tablecellrenderer tablecelleditor

我是一名软件开发人员学徒,必须为我的公司编写一个特定于图形项目的配置编辑器。我使用Apache POI从项目的配置excel文件加载数据,并将数据包装到ConfigValue对象中。对于不同的ConfigValue对象,必须有不同的单元格编辑器和渲染器...

我的程序的GUI使用自定义JTable和DefaultTableModel。表/模型中的每个值都是ConfigValue,对于定义的不同ConfigTypes,它们应该以不同的方式呈现。 (到目前为止,我把它全部工作 - 导入,包装,加载到表中)

但我对其中一个自定义类型的TableCellRendererTableCellEditor有一些问题,这些自定义类型应该呈现为包含所有可能的后端实体值的ComboBox。 ComboBox被渲染并显示正确的开始值...但是当我将一个单元格更改为另一个ConfigValue时...渲染器不显示此值...(它总是更改为相同的值(编辑器的第一个&#) 39; s值)对于一个单元格)

任何人都可以帮我解决我的编辑/渲染器错误吗?

public class ConfComboBoxCellEditor extends DefaultCellEditor {

   public ConfComboBoxCellEditor(List<ConfigValue> possibleValues) {
       super(new JComboBox(possibleValues.toArray()));
   }

   @Override
   public Object getCellEditorValue() {
       Object cellEditorValue = super.getCellEditorValue();
       System.out.println("DEBUG - CELL EDITOR - get editor value --> " + ((ConfigValue) cellEditorValue).toString());
       return cellEditorValue;
   }
}


public class ConfComboBoxCellRenderer extends JComboBox<ConfigValue> implements TableCellRenderer {

   public ConfComboBoxCellRenderer() {
       System.out.println("NEW CELL RENDERER");
   }

   @Override
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
       ConfComboBoxCellRenderer renderer = (ConfComboBoxCellRenderer) table.getCellRenderer(row, column);
       renderer.removeAllItems();
       renderer.addItem((ConfigValue) value);
       renderer.setSelectedItem(value);
       System.out.println("DEBUG - CELL RENDERER " + row + ", " + column + " - get cell render comp --> " + ((ConfigValue) value));
       return this;
   }
}

1 个答案:

答案 0 :(得分:1)

  

任何人都可以帮我解决我的编辑/渲染器错误吗?

  • JTable support JComboBox as TableCellEditor,为每个用作TableCellEditor的JComboBox设置不同的数据集没有任何问题

  • TableCellRenderer only shows, painting the value stored in DefaultTableModel,然后renderer.xxxXxx中的每个代码行都会错误解释Swing中的Renderers Concept,反之亦然,可能是繁重的任务,Renderer不会设置/ getValue,一个新事件来自所有单元格的所有鼠标/键事件在JViewport中可见,以及来自JTable / TableModel API的内部事件,

  • 您的渲染器并不是关于如何将JComboBox绘制为渲染组件

  • 没有切割器,也没有没有SSCCE / MCVE的细节,短期可运行,可编译为局部变量中JTable / DefaultTableModel的硬编码值