Nimbus和备用行颜色

时间:2012-10-22 09:18:12

标签: java swing jtable render nimbus

我不明白Nimbus中的替代行着色是如何工作的。看起来真的很疯狂!我想在这里澄清一切。

对于演示,让我们说我们想要一个交替红色和粉红色行的JTable (我不关心哪个颜色是第一个)。

没有重新定义执行自己的“模2”的自定义cellRenderers ,并且没有覆盖JTable中的任何方法,我想列出启动一个应用程序和获取带有自定义备用的JTable之间的必要步骤行颜色仅使用Nimbus属性

以下是我希望遵循的步骤:

  1. 安装Nimbus PLAF
  2. 自定义“Table.background”nimbus属性
  3. 自定义“Table.alternateRowColor”nimbus属性
  4. 使用简单数据/标题创建JTable
  5. 将jTable包装在JScrollPane中并将其添加到JFrame
  6. 显示JFrame
  7. 这里是源代码:


    public class JTableAlternateRowColors implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new JTableAlternateRowColors());
        }
    
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(new NimbusLookAndFeel());
            } catch (UnsupportedLookAndFeelException e) {
                e.printStackTrace();
            }
    
            UIManager.getDefaults().put("Table.background", Color.RED);
            UIManager.getDefaults().put("Table.alternateRowColor", Color.PINK);
    
            final JFrame jFrame = new JFrame("Nimbus alternate row coloring");
            jFrame.getContentPane().add(new JScrollPane(new JTable(new String[][] {
                    {"one","two","three"},
                    {"one","two","three"},
                    {"one","two","three"}
            }, new String[]{"col1", "col2", "col3"}
            )));
            jFrame.setSize(400, 300);
            jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            jFrame.setVisible(true);
        }
    }
    

    这是JDK6代码。 有人可以告诉我这里出错吗?


    根据@ kleopatra的评论以及整个社区的贡献,这是使用Nimbus属性获得备用行着色的方法

    公共类JTableAlternateRowColors实现Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JTableAlternateRowColors());
    }
    
    @Override
    public void run() {
        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
    
        UIManager.put("Table.background", new ColorUIResource(Color.RED));
        UIManager.put("Table.alternateRowColor", Color.PINK);
        UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", new ColorUIResource(Color.RED));
    
        final JFrame jFrame = new JFrame("Nimbus alternate row coloring");
        final JTable jTable = new JTable(new String[][]{
                {"one", "two", "three"},
                {"one", "two", "three"},
                {"one", "two", "three"}
        }, new String[]{"col1", "col2", "col3"});
        jTable.setFillsViewportHeight(true);
        jFrame.getContentPane().add(new JScrollPane(jTable));
        jFrame.setSize(400, 300);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }
    

    }

2 个答案:

答案 0 :(得分:10)

看起来像几个错误的干扰......

要更改默认表格背景和默认条带化,UIManager的预期(不仅是你的,我的)配置(对于所有尊重alternateRow属性的LAF也是如此)将是:

UIManager.put("Table.background", Color.RED);
UIManager.put("Table.alternateRowColor", Color.PINK);

对Metal和Nimbus都不起作用

  • in Metal:没有条纹,表格全是红色
  • 在Nimbus中:条纹白色/粉红色,即表格背景被忽略

第一个的基本原因可以在DefaultTableCellRenderer中找到:

Color background = unselectedBackground != null
                        ? unselectedBackground
                        : table.getBackground();
if (background == null || background instanceof javax.swing.plaf.UIResource) {
    Color alternateColor = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
    if (alternateColor != null && row % 2 != 0) {
        background = alternateColor;
    }
}

它的逻辑是弯曲的:仅当的背景是colorUIResource时才采用替代颜色,这是一个相当弱的区别。无论如何,它引导我们下一次尝试:

UIManager.put("Table.background", new ColorUIResource(Color.RED));
UIManager.put("Table.alternateRowColor", Color.PINK);

这看起来很好(除了复选框渲染器的典型问题,但这是另一个错误的故事;-)对于金属,仍然没有运气Nimbus。

下一步是查找可能相关的Nimbus defaults,然后申请(在设置LAF之后):

UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", 
    new ColorUIResource(Color.RED));

修改(正如评论中提到的那样)

JXTable试图完全解决问题 - 它的条带化手段是从HighlighterFactory中检索到的荧光笔。需要通过从lookAndFeelDefaults中删除alternateRowColor属性并使用新键“UIColorHighlighter.stripingBackground”添加它来弄脏Nimbus

答案 1 :(得分:3)

使用Nimbus属性(+1到@Kleopatra证明我错了:()你可以设置交替的行颜色

UIManager.put("Table.alternateRowColor", Color.PINK);
UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", Color.RED);

或者通过:

扩展JTable并覆盖prepareRenderer(TableCellRenderer renderer, int row, int column),以便为单元格绘制所需的颜色( RED PINK )。

这是一个我希望它有帮助的简短例子。

额外功能 它还会覆盖paintComponent(..),它会调用paintEmptyRows(Graphics g),它会为JScrollPane视口的整个高度和宽度绘制行,但这仅适用于setFillsViewPortHeight设置为{{1}的情况在true

enter image description here

MyTable

<强>参考文献: