我正在构建一个摇摆应用程序,它将在左侧有一个项目列表,在右侧有一个表格。右侧显示的表格数量取决于左侧选择的项目。我希望能够“突出显示”(setBackground)所有正在显示的表中相同的行。
我已经阅读了有关覆盖 prepareRenderer 或 getTableCellRendererComponent 的信息。然后,条件渲染逻辑位于 Overridden 方法中。
DefaultTableCellRenderer getTableCellRendererComponent 永远不会被调用 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 布尔值并相应地更改背景。现在这已经足够好了(因为我是唯一一个使用这个程序的人),但是必须有一种更好的方法能够根据不同表的条件或值同时比较和更改一个表的呈现。
或者我可以解决这个问题吗?
提前感谢您的阅读/回复