java - TableCellEditor 设置新值时 TableCellRenderer 不改变值

标签 java swing jtable tablecellrenderer tablecelleditor

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

我程序的 GUI 使用自定义 JTable 和 DefaultTableModel。表/模型中的每个值都是一个 ConfigValue,它应该针对定义的不同 ConfigType 以不同方式呈现。 (就我而言,一切正常——导入、包装、加载到表中)

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

谁能帮我解决我的编辑器/渲染器做错了什么?

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

最佳答案

Can anyone help me out what I am doing wrong with my Editor/Renderer?

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

  • TableCellRenderer only shows, painting the value stored in DefaultTableModel ,那么 renderer.xxxXxx 中的每一行代码都是对 Swing 中渲染器概念的错误解释,适得其反并且可能是繁重的任务,渲染器不是设置/获取值的地方,从所有鼠标/键事件中触发一个新事件来自所有单元格都是可见的在 JViewport 中,加上来自 JTable/TableModel API 的内部事件,

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

  • 没有 cleaver,也没有没有 SSCCE/MCVE 的细节,可短时间运行,可使用局部变量中 JTable/DefaultTableModel 的硬编码值进行编译

关于java - TableCellEditor 设置新值时 TableCellRenderer 不改变值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24654701/

相关文章:

Java - 如何在 JTextPane 中正确显示 ANSI 艺术

java - 桌面 UI 设计工具,最好是 Java 或 Java 包装器

java - 如何在 JPanel 的 gridLayout 中绘制随机形状

java - Jtable cellEditor 集不适用于我的表模型定义

java - 如何让 jfilechooser 只接受 .txt

将图像显示到 JFrame 时出现 java.lang.NullPointerException

java - JAVA 中的机器人 KeyEvent.VK_AT 问题

java - 为什么打开 Web 浏览器时 Java 的计时会受到影响?

java - 使 BorderLayout 中的两个 JTable 中的行可选择?

java - 删除行后 JTable 不刷新