ListCellRenderer每次添加新标签?

时间:2012-11-09 02:11:49

标签: java swing jlist renderer listcellrenderer

我编写了自己的ListCellRenderer(下面的代码),它使我的单元格透明。 现在如果我运行这个,每次点击一个listitem,它就变得比以前更白了。可能是,JList总是添加这个新的JLabel - 我创建的 - 并覆盖了最后一个?

    jListPriority.setOpaque(true);
        jListPriority.setBackground(new Color(255, 255, 255, 10));
        jListPriority.setBorder(BorderFactory.createLineBorder(new Color(250, 250, 250)));

        jListPriority.setCellRenderer(new ListCellRenderer() {

                private JLabel label = new JLabel();

                public Component getListCellRendererComponent(JList list, Object value,   
                                 int index, boolean isSelected, boolean cellHasFocus) {

                    label.setOpaque(true);
                    label.setText(value.toString());
                    label.setForeground(new Color(250, 250, 250));
                    label.setFont(new Font("Lucida Grande", Font.PLAIN, 13));
                    label.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(250, 250, 250, 50)));
                    label.setPreferredSize(new Dimension(label.getPreferredSize().width, label.getPreferredSize().height + 3));

                    if (isSelected) {
                        label.setBackground(new Color(255, 255, 255, 20));
                    } else {
                        label.setBackground(new Color(255, 255, 255, 10));
                    }

                    return label;
                }
            });

2 个答案:

答案 0 :(得分:3)

Graphics2D的默认复合使用AlphaComposite.SRC_OVER规则,因此预期结果。您需要为所需效果指定合适的模式。您可以从example获得一些想法。

image http://i46.tinypic.com/6gj1gk.png

答案 1 :(得分:3)

我认为你不想创建太多的jlabel实例。在您的示例中,每次调用get ...方法创建一个jlabel实例只需将变量标签转换为字段即可。