Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple ListCellRenderer

Is it possible to have multiple ListCellRenderer's implementation in a single class?

Actually I have multiple JList's in my application and I would I am in need of different ListCellRenderer's for each.

Can I have different class names for Implementing ListCellRenderer's Component method.

For ex: If I have a class with name "MultiColumnCellRenderer" with some implementation of Component method and another class with name "MultiColumnCellRenderer2" with some other implementation of Component method?

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;
    }
}`

And if I do something like:

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

Its not working out....

I am looking for different rendering for both list1 and list2.

How can I achieve this

like image 459
kartik mittal Avatar asked Jan 23 '26 06:01

kartik mittal


2 Answers

Is it possible to have multiple ListCellRenderer's implementation in a single class?

If by 'have' you mean 'use' and if by 'class' you mean 'GUI', then yes.

Here is an example:

MultiColumnCellRendererTest

Source

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;
    }
}
like image 173
Andrew Thompson Avatar answered Jan 25 '26 19:01

Andrew Thompson


Here's an SSCCE that works - maybe you can figure out how this is different from your own code.

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");
    }
}
like image 27
Russell Zahniser Avatar answered Jan 25 '26 19:01

Russell Zahniser



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!