2

単一のクラスに複数の ListCellRenderer の実装を含めることは可能ですか?

実際、私のアプリケーションには複数の JList があり、それぞれに異なる ListCellRenderer が必要です。

ListCellRenderer の Component メソッドを実装するために別のクラス名を使用できますか。

例: Component メソッドの実装を含む「MultiColumnCellRenderer」という名前のクラスと、Component メソッドの他の実装を含む「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 の両方で異なるレンダリングを探しています。

どうすればこれを達成できますか

4

3 に答える 3

4

1つのクラスに複数のListCellRendererの実装を含めることは可能ですか?

「持っている」とは「使用」を意味し、「クラス」とは「GUI」を意味する場合は、はい。

次に例を示します。

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;
    }
}
于 2012-01-24T13:49:05.907 に答える
1

単一の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;
        }
    }
}
于 2012-01-24T21:10:04.770 に答える