关于java:为Nimbus外观设计简单的单元格渲染器

Designing simple cell renderer for Nimbus look and feel

我有一个简单的单元格渲染器,它由几个JLabel组成(渲染器本身扩展了JPanel),我正在尝试使其能够在Nimbus外观上进行合理的渲染。基本上发生的是在较浅的行中(因为Nimbus具有交替的行着色),我的特定单元格渲染器正在使用表格背景色(比较浅和较深的行颜色都暗得多)。在我的渲染器中,我做:

1
2
3
4
5
6
if (isSelected) {
    setBackground(table.getSelectionBackground);
}
else {
    setBackground(table.getBackground);
}

如果我将整个代码块都注释掉了,那么我的所有行都使用较暗的行颜色(不是表格背景,也不是其他颜色)。我不确定我什至知道会发生什么!上面的代码片段如何产生具有不同背景颜色的单元格? table.getBackground颜色是否在我的方法调用之间改变?

我尝试使用以下代码段:

1
2
3
4
5
6
Color alternateColor = sun.swing.DefaultLookup.getColor(
                         peer,
                         peer.getUI,
                        "Table.alternateRowColor");
if (alternateColor != null && row % 2 == 0)
    setBackground(alternateColor);

DefaultTableCellRenderer类中。而且它似乎根本没有任何影响。有没有人有使用Nimbus的自定义单元格渲染器?

编辑:如果有人感兴趣,这实际上是Scala表单元格渲染器的问题,因为我实际上是在使用Scala而不是Java。以下可接受的答案在Java程序中可以正常工作。在此提交单独的问题。


如果可以的话,您的第一段代码。我认为您必须对其他行使用UIManager.getColor("Table.alternateRowColor"),否则要使用table.getBackground()。对于选定的行,请使用table.getSelectionBackground()。因此您的代码可能看起来像

1
2
3
4
5
6
7
8
9
10
if (isSelected) {
    setBackground(table.getSelectionBackground());
}
else {
    if ( row % 2 == 0 ) {
       setBackground(UIManager.getColor("Table.alternateRowColor"));
    } else {
       setBackground(table.getBackground());
    }
}

请不要忘记确保面板不透明且标签是透明的。

以下是Nimbus UI默认设置的良好链接:
http://www.duncanjauncey.com/java/ui/uimanager/UIDefaults_Java1.6.0_11_Windows_2000_5.0_Nimbus.html