我一直在努力学习JTable渲染器,并且几乎已经确定了我正在寻找的行为,除了最后一部分。我想删除JTable默认为布尔值渲染的复选框,然后渲染一个简单的String,我就不能在这里解决我的问题。
由于我对渲染器的更改非常小(只有基本的String操作,加上布尔值的前景色),我想扩展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
的行为都应如此,只有布尔才会起作用。无论我setText
在布尔值的情况下,我的文本都被默认复选框取代。 我了解默认情况下布尔值使用单独的渲染器,但不应调用 setDefaultRenderer
<{strong> Object.class
覆盖默认值 Boolean.class
?
答案 0 :(得分:3)
myTable.setDefaultRenderer(Object.class, new MyTableRenderer());
您正在创建布尔渲染器,而不是对象渲染器。所以你应该使用:
myTable.setDefaultRenderer(Boolean.class, new MyTableRenderer());
但是不应该在Object.class上调用setDefaultRenderer覆盖Boolean.class的默认值吗?
没有。如果没有为特定类指定渲染器,则Object渲染器将用作默认渲染器。由于存在默认的布尔渲染器,因此您将使用该渲染器,除非您使用自己的渲染器替换渲染器。
我也一直在为所有单元格类型使用相同的渲染器,因为为每个简单的操作创建一个新类似乎很愚蠢
一般而言,如果不确切知道自己在做什么,就应该创建自定义渲染器。每当你看到代码中的if / else逻辑时,你就知道你有设计问题。使用JTable提供的功能,为每类数据创建渲染器,而不是使用if / else。
如果您认为有很多常见的渲染逻辑,那么您可以使用通用渲染代码创建渲染器。然后,您创建多个渲染器,为您要支持的每类数据扩展基础渲染器。
我试图为所有细胞类型使用相同的渲染器,
这就是我在上面陈述的问题。
如果你真的有充分的理由这样做,那么你还需要为你想要共享同一个渲染器的所有数据类添加我建议的代码行。至少你需要为具有默认渲染器的类执行此操作。