Java 多重ListCellRenderer

Java 多重ListCellRenderer,java,swing,render,jlist,listcellrenderer,Java,Swing,Render,Jlist,Listcellrenderer,在一个类中可以有多个ListCellRenderer的实现吗 实际上,我的应用程序中有多个JList,我需要为每个应用程序使用不同的ListCellRenderer 我可以用不同的类名来实现ListCellRenderer的组件方法吗 例如:如果我有一个名为“MultiColumnCellRenderer”的类,其中有一些组件方法的实现,另一个名为“MultiColumnCellRenderer2”的类,其中有一些组件方法的实现 public class MultiColumnCellRende

在一个类中可以有多个ListCellRenderer的实现吗

实际上,我的应用程序中有多个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());
它不起作用

我正在为列表1和列表2寻找不同的渲染

我怎样才能做到这一点呢?

这里有一个可行的方法-也许你可以找出这与你自己的代码有什么不同

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");
    }
}
在一个类中可以有多个ListCellRenderer的实现吗

如果“have”是指“use”,如果“class”是指“GUI”,那么是的

以下是一个例子:

来源
还可以安排单个
ListCellRenderer
实现来管理指定的
颜色。在下面的变体中,
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;
        }
    }
}

什么不起作用?代码没有编译吗?在运行时抛出异常?或者这两个列表的外观看起来没有什么不同吗?嗨,罗素,谢谢你的快速回复。。。。。实际上没有任何异常,也没有任何编译错误。。。。但是我相信组件方法下的代码没有得到执行。。。。这是由于组件方法在不同类下的多个实现造成的吗?我实际上用调试器检查过,指令指针并没有在组件方法的主体内移动。。。虽然它确实在“MultiColumnCellRenderer”或“MultiColumnCellRenderer2”类的构造函数下执行语句,但为了更快地获得更好的帮助,请发布一个。顺便说一句,
MultiColumnCellRenderer
&
MultiColumnCellRenderer2
GetListCellRenderComponent
方法中是相同的。2) 添加
@Override
符号以检查方法名称/签名是否正确。@kartik mittal我的建议与(@Andrew Thompson)相同,顺便说一句,您的逻辑一定有其他问题,因为我看不出任何不起作用的原因…Hiii。。。我的代码与你刚刚发布的代码非常相似。。。。但是donno为什么我的身体不好-(你好……谢谢大家的帮助……问题只出在我的逻辑上……为StackOverflow及其非常有用的用户干杯……干杯
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;
        }
    }
}