【问题标题】:JList where each line might need to have a different font-colorJList 每行可能需要有不同的字体颜色
【发布时间】:2011-03-06 19:07:33
【问题描述】:

我是这里的新手,刚刚加入了这个美妙的社区。我不得不承认这是编程问题和答案的最佳网站。现在让我进入正题:

我正在尝试创建一个 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;

【问题讨论】:

  • 我已经检查了该解决方案,但与该示例不同,我只是不确定如何在每种情况下实际手动提供我想要使用的颜色。
  • 那不是 SSCCE。我该如何编译?您在哪里构建 CustomObject 并将其添加到模型中?您没有在下面的链接中看到我提供给您的 SSCCE 吗?还有为什么 getColor 方法返回一个字符串, setForeground() 方法需要一个 Color 对象。既然你传入了一个 Color 对象,为什么还要将它来回转换为 String/Color?
  • 是的,这只是代码的片段,我没有时间阅读您给我的SSCCE页面,所以我只是粘贴了代码。由于问题源于这里,这还不够吗?是的,getColor 方法需要修改,但这与问题无关。无法编译的行是:CustomObject o = (CustomObject)value;
  • 而且我没有时间创建测试程序。根据定义,在解决问题之前,您不知道代码的哪一部分导致了问题,因此您不知道解决问题的相关代码是什么,或者不是什么。问题显然是您添加到模型中的数据(您认为您添加了一个 CustomObject 但代码告诉您添加了一个字符串)并且您没有发布该代码。祝你好运,我试图提供帮助,但我没有时间玩 20 个问题,这就是我要求参加 SSCCE 的原因!

标签: java swing colors jlist


【解决方案1】:

如果您希望每条线具有不同的背景颜色,则需要将该信息存储在模型中。因此,不是简单地在模型中存储一个字符串,而是存储一个包含两个属性的自定义对象,颜色和文本。然后您的自定义渲染器使用 Color 设置线条的背景,使用 Text 设置线条的值。

posting 显示了使用此方法的示例。该示例适用于组合框,但概念相同。

编辑:我相信这是最初的例子:

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

【讨论】:

  • camickr 你能告诉我自定义渲染器是如何工作的吗?我知道我的要求太多了,但正如我所说,我对 Java 有点陌生,在编写自定义代码方面没有那么经验......
  • 你在哪里给出了一个示例渲染器的链接,该渲染器可以交替线条的颜色。所以代码并没有太大的不同。您将值转换为“自定义对象”。然后使用自定义对象的颜色设置背景。然后使用自定义对象的文本设置标签文本。如果您需要更多帮助,请发布您的 SSCCE (sscce.org)。另请注意,您应该扩展默认渲染器,而不是 JLabel。
  • 我现在正试图让它工作,但我遇到了这一行的一些问题:CustomObject o = (CustomObject)value;由于某些奇怪的原因,我得到了异常: java.lang.ClassCastException: java.lang.String cannot be cast to app.CustomObject
  • 你不能向 ListModel 添加字符串。您需要将 CustomObject 添加到模型中。我给了你一个工作的例子。我不是读心术,我猜不出你在做什么,而且你还没有发布 SSCCE,所以我无法提供更多帮助。
  • 好吧好吧,那么让我发布我的SSCCE,我是直接把它放在评论中还是编辑我的第一个帖子?
猜你喜欢
  • 2014-09-13
  • 2017-04-27
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多