自定义JFileChooser:FileFilters丢失

时间:2011-07-28 11:53:11

标签: java swing jfilechooser filefilter

我最终使用Eng的方法在JList和JFileChooser的JComboBox上定制了选择颜色。 Fouad建议here

public void customizeJFileChooser(Container c)
    {
        Component[] cmps = c.getComponents();
        for (Component cmp : cmps)
        {
            if (cmp instanceof JList)
            {
                ((JList)cmp).setSelectionBackground(new Color(164,164,164));
            }
            if (cmp instanceof JComboBox)
            {
                ((JComboBox)cmp).setRenderer(new DefaultListCellRenderer() {
                    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                        Component comp = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                        if (isSelected)
                        comp.setBackground(new Color(164,164,164));
                        return comp;
                        }
                        });
            }
            if (cmp instanceof Container)
            {
                customizeJFileChooser((Container) cmp);
            }
        }
    }

非常适合颜色,但是......现在我对FileFilter名称有疑问,如上所示:

How it looks, and how I should look (and looked before changing the colors)

如果我不调用customizeJFileChooser,它的名称是正确的,所以它必须是该方法的问题。有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

ListCellRenderer很可能不仅仅是一个DefaultListCellRenderer,而是一个派生类。 因此,解决方案是获取原始并包装它,而不是替换它。

        if (cmp instanceof JComboBox)
        {
            ((JComboBox)cmp).setRenderer(new DefaultListCellRenderer() {
                private ListCellRenderer superLCR = ((JComboBox)cmp).getRenderer();
                public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                    Component comp = superLCR.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                    if (isSelected)
                        comp.setBackground(new Color(164,164,164));
                    return comp;
                }
            });
        }