Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I'm trying to make a ComboBox that uses different colors for different items. I wrote out some test code but it doesn't seem to work. Adding in the renderer causes the program to crash but commenting it out makes the box display on in the frame.

Is there anything I'm missing or am I doing this the wrong way? I tried using the custom ComboBox Renderer tutorial as an example.

Here is my code:

TestComboColor.java

import java.awt.Color;

import javax.swing.JComboBox;
import javax.swing.JFrame;


public class TestComboColor {

    static Color[] colors = {Color.BLUE, Color.GRAY, Color.RED};
    static String[] strings = {"Test1", "Test2", "Test3"};

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("JAVA");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JComboBox cmb = new JComboBox();
        ComboBoxRenderer renderer = new ComboBoxRenderer(cmb);

        renderer.setColors(colors);
        renderer.setStrings(strings);

        cmb.setRenderer(renderer);

        frame.add(cmb);
        frame.pack();
        frame.setVisible(true);
    }
}

ComboBoxRenderer.java

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

import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;


public final class ComboBoxRenderer extends JPanel implements ListCellRenderer
{

    private static final long serialVersionUID = -1L;
    private Color[] colors;
    private String[] strings;

    JPanel textPanel;
    JLabel text;

    public ComboBoxRenderer(JComboBox combo) {

        textPanel = new JPanel();
        textPanel.add(this);
        text = new JLabel();
        text.setOpaque(true);
        text.setFont(combo.getFont());
        textPanel.add(text);
    }

    public void setColors(Color[] col)
    {
        colors = col;
    }

    public void setStrings(String[] str)
    {
        strings = str;
    }

    public Color[] getColors()
    {
        return colors;
    }

    public String[] getStrings()
    {
        return strings;
    }

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

        if (isSelected)
        {
            setBackground(list.getSelectionBackground());
        }
        else
        {
        }

        if (colors.length != strings.length)
        {
            System.out.println("colors.length does not equal strings.length");
            return this;
        }
        else if (colors == null)
        {
            System.out.println("use setColors first.");
            return this;
        }
        else if (strings == null)
        {
            System.out.println("use setStrings first.");
            return this;
        }

        text.setText(strings[index]);
        text.setForeground(colors[index]);
        text.setBackground(getBackground());
        return text;


    }

}

Thanks!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
168 views
Welcome To Ask or Share your Answers For Others

1 Answer

Is this what you mean?

TestComboColor

import java.awt.Color;
import java.awt.Component;
import javax.swing.*;

public class TestComboColor {

    static Color[] colors = {Color.BLUE, Color.GRAY, Color.RED};
    static String[] strings = {"Test1", "Test2", "Test3"};

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("JAVA");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JComboBox cmb = new JComboBox(strings);
        ComboBoxRenderer renderer = new ComboBoxRenderer(cmb);

        renderer.setColors(colors);
        renderer.setStrings(strings);

        cmb.setRenderer(renderer);

        frame.add(cmb);
        frame.pack();
        frame.setVisible(true);
    }
}

class ComboBoxRenderer extends JPanel implements ListCellRenderer
{

    private static final long serialVersionUID = -1L;
    private Color[] colors;
    private String[] strings;

    JPanel textPanel;
    JLabel text;

    public ComboBoxRenderer(JComboBox combo) {

        textPanel = new JPanel();
        textPanel.add(this);
        text = new JLabel();
        text.setOpaque(true);
        text.setFont(combo.getFont());
        textPanel.add(text);
    }

    public void setColors(Color[] col)
    {
        colors = col;
    }

    public void setStrings(String[] str)
    {
        strings = str;
    }

    public Color[] getColors()
    {
        return colors;
    }

    public String[] getStrings()
    {
        return strings;
    }

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

        if (isSelected)
        {
            setBackground(list.getSelectionBackground());
        }
        else
        {
            setBackground(Color.WHITE);
        }

        if (colors.length != strings.length)
        {
            System.out.println("colors.length does not equal strings.length");
            return this;
        }
        else if (colors == null)
        {
            System.out.println("use setColors first.");
            return this;
        }
        else if (strings == null)
        {
            System.out.println("use setStrings first.");
            return this;
        }

        text.setBackground(getBackground());

        text.setText(value.toString());
        if (index>-1) {
            text.setForeground(colors[index]);
        }
        return text;
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...