【发布时间】:2012-09-12 07:31:39
【问题描述】:
我正在构建一个摆动应用程序,它的左侧是项目列表,右侧是表格。右侧显示的表格数量取决于左侧选择的项目。我希望能够“突出显示”(setBackground)所有正在显示的表中相同的行。
我已经阅读了关于重写 prepareRenderer 或 getTableCellRendererComponent 的内容。然后,条件渲染逻辑位于 Overridden 方法中。
DefaultTableCellRenderer getTableCellRendererComponent never gets called http://tips4java.wordpress.com/2010/01/24/table-row-rendering/ http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer
但据我所知和我的理解(如果我错了,请纠正我)这两个选项都不允许您在这个被覆盖的方法中同时比较两个不同的 JTable。 prepareRenderer 在扩展 JTable 的类中被覆盖,因此它在特定表上被实例化。然后,被覆盖的方法只会影响 Table 的特定实例。
public class CustomRenderer extends JTable {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
// add custom rendering here
return c;
}};
...
CustomRenderer currTable = new CustomRenderer();
getTableCellRendererComponent 是通过特定 JTable 的 columnModel 中特定列的 setCellRenderer 设置的。
public class CustomRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (isSelected) {
l.setBackground(Color.gray);
}
else {
l.setBackground(Color.white);
}
return l;
}};
...
CustomRenderer cr = new CustomRenderer();
currTable.getcolumnModel().getColumn(1).setCellRenderer(cr);
那么我该怎么做呢
if(tableOne.getValueAt(1, 1).equals(tableTwo.getValueAt(1, 1)
//set Cell 1,1 background(Color.blue)
else
//set Cell 1,1 background(Color.red)
现在我有一个非常丑陋的 hack,它使用多个表格单元格选择和一个 getTableCellRendererComponent 方法,该方法测试 isSelected 布尔值并相应地更改背景。现在这已经足够好了(因为我是唯一一个使用这个程序的人)但是必须有一种更好的方法能够根据不同表的条件或值同时比较和更改一个表的呈现。
或者我的问题可能是错误的?
提前感谢您的阅读/回复
【问题讨论】:
标签: java swing jtable comparator renderer