【问题标题】:Multiple ListCellRenderer多个 ListCellRenderer
【发布时间】:2012-02-17 17:26:01
【问题描述】:

一个类中是否可以有多个 ListCellRenderer 的实现?

实际上,我的应用程序中有多个 JList,我需要为每个 JList 提供不同的 ListCellRenderer。

实现ListCellRenderer的组件方法可以有不同的类名吗?

例如:如果我有一个名为“MultiColumnCellRenderer”的类,其中包含一些组件方法的实现,另一个名为“MultiColumnCellRenderer2”的类与其他一些组件方法的实现?

public class MultiColumnCellRenderer extends JPanel implements
        ListCellRenderer {

    public MultiColumnCellRenderer() {
    }

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

// Some implementation of Component Method

        super.setEnabled(list.isEnabled());
        super.setFont(list.getFont());

        return this;
    }
}


public class MultiColumnCellRenderer2 extends JPanel implements
        ListCellRenderer {

    public MultiColumnCellRenderer2() {
    }

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

// Some implementation of Component Method

        super.setEnabled(list.isEnabled());
        super.setFont(list.getFont());

        return this;
    }
}`

如果我这样做:

list1.setCellRenderer(new MultiColumnCellRenderer());
list2.setCellRenderer(new MultiColumnCellRenderer2());

它不工作......

我正在为 list1 和 list2 寻找不同的呈现方式。

我怎样才能做到这一点

【问题讨论】:

  • 什么不起作用?代码不能编译吗?在运行时抛出异常?或者这两个列表的外观看起来并没有什么不同?
  • 嗨Russell,感谢您的快速回复.....实际上没有任何异常也没有任何编译错误......但我相信COMPONENT方法下的代码没有被执行......是不是因为不同类下COMPONENT方法的多次实现?
  • 我实际上是用调试器检查的,指令指针没有在 COMPONENT 方法的主体内移动......虽然它确实在“MultiColumnCellRenderer”或“MultiColumnCellRenderer2”类的构造函数下执行语句
  • 如需尽快获得更好的帮助,请发帖 SSCCE。顺便说一句 1) MultiColumnCellRendererMultiColumnCellRenderer2getListCellRendererComponent 方法中是相同的。 2) 添加@Override 符号以检查方法名称/签名是否正确。
  • @kartik mittal 我与 (@Andrew Thompson) 的建议相同,顺便说一句,您的逻辑肯定有其他问题,因为我看不出有任何不工作的原因......

标签: java swing render jlist listcellrenderer


【解决方案1】:

这是一个有效的SSCCE - 也许您可以弄清楚这与您自己的代码有何不同。

import java.awt.Color;
import java.awt.Component;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
public class TwoLists {
    private static void list(ListCellRenderer renderer, Object... elements) {
        DefaultListModel model = new DefaultListModel();
        for(Object element : elements) {
            model.addElement(element);
        }

        JList list = new JList(model);
        list.setCellRenderer(renderer);

        JFrame frame = new JFrame();
        frame.getContentPane().add(new JScrollPane(list));
        frame.setSize(200, 200);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        list(new DefaultListCellRenderer() {
            public Component getListCellRendererComponent(JList list, Object value,
                    int index, boolean isSelected, boolean cellHasFocus) {
                Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                c.setBackground(Color.RED);
                return c;
            }
        }, "One", "Two", "Three");

        list(new DefaultListCellRenderer() {
            public Component getListCellRendererComponent(JList list, Object value,
                    int index, boolean isSelected, boolean cellHasFocus) {
                Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                c.setBackground(Color.BLUE);
                return c;
            }
        }, "North", "South", "EAST");
    }
}

【讨论】:

    【解决方案2】:

    一个类中是否可以有多个 ListCellRenderer 的实现?

    如果“拥有”是指“使用”,如果“类”是指“GUI”,那么是的。

    这是一个例子:

    来源

    import java.awt.*;
    import javax.swing.*;
    
    class MultiColumnCellRendererTest {
    
        public static void main(String[] args) {
            final String[] fruits = {
                "Apple",
                "Pear",
                "Banana",
                "Grapefruit"
            };
    
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JList fruitList1 = new JList(fruits);
                    fruitList1.setCellRenderer(new MultiColumnCellRenderer());
    
                    JList fruitList2 = new JList(fruits);
                    fruitList2.setCellRenderer(new MultiColumnCellRenderer2());
    
                    JPanel gui = new JPanel(new GridLayout(1,0,2,2));
                    gui.add(fruitList1);
                    gui.add(fruitList2);
    
                    JOptionPane.showMessageDialog(null, gui);
                }
            });
        }
    }
    
    class MultiColumnCellRenderer extends JPanel implements
            ListCellRenderer {
    
        JLabel label;
    
        public MultiColumnCellRenderer() {
            setBackground(Color.RED);
            label = new JLabel();
            add(label);
        }
    
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            label.setText(value.toString());
    
            super.setEnabled(list.isEnabled());
            super.setFont(list.getFont());
    
            return this;
        }
    }
    
    
    class MultiColumnCellRenderer2 extends JPanel implements
            ListCellRenderer {
    
        JLabel label;
    
        public MultiColumnCellRenderer2() {
            setBackground(Color.GREEN);
            label = new JLabel();
            add(label);
        }
    
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            label.setText(value.toString());
    
            super.setEnabled(list.isEnabled());
            super.setFont(list.getFont());
    
            return this;
        }
    }
    

    【讨论】:

    • Hiii...我的代码与您刚刚发布的代码非常相似....但不知道为什么它不适合我... :-(
    • 您好....谢谢大家的帮助...问题出在我的逻辑上...为 StackOverflow 及其非常有帮助的用户干杯...干杯
    【解决方案3】:

    也可以安排单个ListCellRenderer 实现来管理指定的Color。在下面的变体中,darker() 颜色用于表示选择。

    import java.awt.*;
    import javax.swing.*;
    
    /** @see http://stackoverflow.com/questions/8987285 */
    class MultiColumnCellRendererTest {
    
        private static final String[] fruits = {
            "Apple", "Pear", "Banana", "Grapefruit"
        };
    
        public static void main(String[] args) {
    
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JPanel gui = new JPanel(new GridLayout(1, 0, 2, 2));
                    gui.add(createList(Color.red));
                    gui.add(createList(Color.green));
                    JOptionPane.showMessageDialog(null, gui);
                }
            });
        }
    
        private static JList createList(Color color) {
            JList list = new JList(fruits);
            list.setCellRenderer(new ColorCellRenderer(color));
            return list;
        }
    
        private static class ColorCellRenderer extends JLabel implements ListCellRenderer {
    
            private Color background;
            private Color selected;
    
            public ColorCellRenderer(Color background) {
                this.setOpaque(true);
                this.background = background;
                this.selected = background.darker();
                this.setBackground(background);
            }
    
            @Override
            public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
                setText(value.toString());
                setBackground(isSelected ? selected : background);
                return this;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2017-10-05
      相关资源
      最近更新 更多