我一直在尝试学习 JTable 渲染器,并且几乎已经确定了我正在寻找的行为,除了最后一部分。我想删除 JTable 默认为 boolean 值呈现的复选框并呈现一个简单的字符串,但我无法解决这里的问题。
由于我对渲染器的更改非常小(只有基本的字符串操作,加上 boolean 值的前景色),因此我想扩展 DefaultTableCellRenderer
而不是实现 TableCellRenderer
和从头开始。 我还对所有单元格类型使用相同的渲染器,因为为每个简单操作创建一个新类似乎很愚蠢。这是我的相关代码:
public class MyTableRenderer extends DefaultTableCellRenderer {
public MyTableRenderer() {
super();
}
@Override
public void setValue(Object value) {
if(value instanceof Boolean) {
boolean v = (boolean) value;
setForeground( v ? Color.GREEN : Color.RED );
setText( v ? "Alive" : "Dead" );
}
/* else if(value instanceof //Other types, and so on and so forth */
}
}
我将渲染器应用到表格,如下所示:
JTable myTable = new JTable(myTableModel);
myTable.setDefaultRenderer(Object.class, new MyTableRenderer());
我已确保我的表模型正确响应 getColumnClass()
,并且我的渲染器的行为与所有其他类型的 value
的行为相同,只有 boolean 值起作用向上。无论我 setText
在 boolean 值的情况下设置什么,我的文本都会被默认复选框替换。 我知道 boolean 值默认使用单独的渲染器,但不应调用 setDefaultRenderer
on Object.class
覆盖默认值 Boolean.class
?
最佳答案
myTable.setDefaultRenderer(Object.class, new MyTableRenderer());
您正在创建 boolean 渲染器,而不是对象渲染器。所以你应该使用:
myTable.setDefaultRenderer(Boolean.class, new MyTableRenderer());
but shouldn't calling setDefaultRenderer on Object.class override the default for Boolean.class?
没有。如果没有为特定类指定渲染器,则对象渲染器将用作默认渲染器。由于有一个默认的 boolean 渲染器,您将使用该渲染器,除非您用自己的渲染器替换该渲染器。
I also have been using the same renderer for all cell types since it seemed silly to create a new class for each one of my simple operations
在不确切知道您在做什么的情况下,一般来说,您应该创建自定义渲染器。每当您在代码中看到 if/else 逻辑时,您就知道存在设计问题。使用 JTable 提供的功能并为每类数据创建渲染器,而不是使用 if/else。
如果您认为自己有很多通用渲染逻辑,那么您可以使用通用渲染代码创建一个渲染器。然后,您创建多个渲染器,为您想要支持的每种数据类扩展基本渲染器。
I'm trying to use this same renderer for all cell types,
这就是我上面所说的问题。
如果您确实有充分的理由这样做,那么您还需要为您想要共享同一渲染器的所有数据类添加我上面建议的代码行。至少您需要为具有默认渲染器的类执行此操作。
关于java - 将 DefaultTableCellRenderer 中的 boolean 值的复选框替换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30552611/