JList, где каждая строка может иметь другой цвет шрифта - PullRequest
1 голос
/ 22 июня 2010

Я новичок, только что присоединился к этому замечательному сообществу. Я должен признать, что это лучший сайт для программирования вопросов и ответов. Теперь позвольте мне перейти к сути:

Я пытаюсь создать JList, где я могу вводить строки с разными цветами шрифта, взятые из ColorChooser. Я уже пробовал что-то, как описано ниже

Заранее спасибо за любые ответы. С наилучшими пожеланиями, DWC

Вот мой пример кода:

class CustomObject
{
    String s;
    Color color;
    String scolor;

    public CustomObject(Color color, String s)
    {
        this.s = s;
        this.color = color;
    }

    public String getColor()
    {
        return scolor = Integer.toString(color.getRGB());
    }

    public String getData()
    {
        return s;
    }

    @Override
    public String toString()
    {
        return s + color.getRGB();
    }

}

class myListRenderer extends DefaultListCellRenderer
{

Color color;

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

    if (value != null)
    {
        CustomObject o = (CustomObject)value;
        setText(o.getData());
        color = new Color(Integer.parseInt(o.getColor()));
        setForeground(color);
    }
    return this;
}
}

Моя главная проблема в том, что я получаю ошибку:

java.lang.ClassCastException: java.lang.String cannot be cast to app.CustomObject

в строке:

CustomObject o = (CustomObject)value;

1 Ответ

3 голосов
/ 22 июня 2010

Если вы хотите, чтобы каждая строка имела различный цвет фона, вам необходимо сохранить эту информацию в модели.Таким образом, вместо простого хранения String в модели вы сохраняете пользовательский объект, который содержит два свойства, Color и Text.Затем пользовательский рендерер использует Color для установки фона линии и Text для установки значения линии.

Эта публикация показывает пример использования этого подхода.Пример для поля со списком, но концепция идентична.

Редактировать: я полагаю, что это был оригинальный пример:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.basic.*;

public class ComboBoxColor extends JFrame
{
    public ComboBoxColor()
    {
        Object[] items = { Color.red, Color.green, Color.blue };
        JComboBox comboBox = new JComboBox( items );
        comboBox.setRenderer( new ColorRenderer( comboBox) );
        getContentPane().add( comboBox, BorderLayout.NORTH );
        add( new JTextField(), BorderLayout.SOUTH);
    }

    public static void main(String[] args)
    {
        ComboBoxColor frame = new ComboBoxColor();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    class ColorRenderer extends BasicComboBoxRenderer
    {
        JComboBox comboBox;
        Border border;


        public ColorRenderer(JComboBox comboBox)
        {
            this.comboBox = comboBox;
            border = new LineBorder( Color.WHITE );
        }

        public Component getListCellRendererComponent(
            JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
        {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

            setText( value.toString() );

            if (!isSelected)
                setBackground( (Color)value );

            return this;
        }
    }
}
...