Несколько ListCellRenderer

Возможно ли иметь несколько реализаций 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());

Не получается....

Я ищу другой рендеринг для list1 и list2.

Как я могу достичь этого


person kartik mittal    schedule 24.01.2012    source источник
comment
Что не работает? Код не компилируется? Выбросить исключение во время выполнения? Или внешний вид просто не отличается между двумя списками?   -  person Russell Zahniser    schedule 24.01.2012
comment
Привет, Рассел, спасибо за быстрый ответ..... На самом деле нет ни исключений, ни ошибок компиляции.... Но я считаю, что код в методе COMPONENT не выполняется.... Это связано с множественной реализацией COMPONENT метод под разными классами?   -  person kartik mittal    schedule 24.01.2012
comment
Я действительно проверил это с помощью отладчика, указатель инструкции не перемещается внутри тела метода COMPONENT... хотя он выполняет операторы в конструкторе класса MultiColumnCellRenderer или MultiColumnCellRenderer2.   -  person kartik mittal    schedule 24.01.2012
comment
PS... Вся реализация находится в одном файле JAVA...   -  person kartik mittal    schedule 24.01.2012
comment
Код, который у вас есть, выглядит так, как будто он должен работать. Я предполагаю, что оба списка действительно имеют содержимое? Если у вас один из средств визуализации установил красный цвет фона, а другой — синий, отображаются ли оба списка красными? Или один все еще цвет по умолчанию?   -  person Russell Zahniser    schedule 24.01.2012
comment
Во-первых, поместите только один класс в файл Java. Это строго не запрещено языком, но должно рассматриваться как плохая практика.   -  person Grooveek    schedule 24.01.2012
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE. Кстати 1) MultiColumnCellRenderer и MultiColumnCellRenderer2 идентичны в методе getListCellRendererComponent. 2) Добавьте нотацию @Override, чтобы проверить правильность имени/сигнатуры метода.   -  person Andrew Thompson    schedule 24.01.2012
comment
@RussellZahniser ... выполняются только инструкции первого LISTCELLRENDERER .... т. е. цвет одного списка изменяется, а цвет другого по-прежнему остается по умолчанию   -  person kartik mittal    schedule 24.01.2012
comment
@Grooveek.... Я тоже это предпочитаю... но если я создам другой класс, то я не смогу получить доступ к переменным моего родительского класса без создания его объекта.... и мне не нужен конструктор моего родительского класса быть вызванным   -  person kartik mittal    schedule 24.01.2012
comment
@kartik mittal У меня то же предложение, что и у (@Andrew Thompson), кстати, у вашей логики должна быть какая-то другая проблема, потому что я не вижу причин, почему это не работает ...   -  person mKorbel    schedule 24.01.2012


Ответы (3)


Возможно ли иметь несколько реализаций ListCellRenderer в одном классе?

Если под «иметь» вы подразумеваете «использовать», а под «классом» — «графический интерфейс», то да.

Вот пример:

MultiColumnCellRendererTest

Источник

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;
    }
}
person Andrew Thompson    schedule 24.01.2012
comment
Привет... Мой код очень похож на код, который вы только что опубликовали.... но не знаю, почему он не работает у меня.... :-( - person kartik mittal; 24.01.2012
comment
Привет.... Спасибо всем за помощь... Проблема была только в моей логике... ПРИВЕТСТВИЕ StackOverflow и его ОЧЕНЬ ПОЛЕЗНЫМ пользователям... ПРИВЕТСТВИЕ - person kartik mittal; 24.01.2012

Вот работающий 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");
    }
}
person Russell Zahniser    schedule 24.01.2012

Также возможно организовать одну реализацию 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;
        }
    }
}
person trashgod    schedule 24.01.2012