通过自定义ListCellRendered隐藏JList字符串的一部分

时间:2013-02-03 03:25:27

标签: java render jlist cellrenderer

以下是我用于添加类型(常规),(耳语),(公会)或(全局)

类型的消息的'协议语法'
// add the message in list box
ChatJInternalFrame.modelChatList.addElement("(general)" + characterName + ": " + chatMessage);

这是我设置列表的模型和单元格渲染器的地方:

modelChatList = new DefaultListModel<String>();
listForChat = new JList<String>(modelChatList);
listForChat.setFont(new Font("Lucida Console", Font.PLAIN, 14));
listForChat.setCellRenderer(new ColoredChatListRenderer());

这是我的自定义cellRenderer:

public class ColoredChatListRenderer extends DefaultListCellRenderer {

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

        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);  

        String s = String.valueOf(value);
        String splitPipe[] = s.split("\\)");        

        if(s.length() > 7 && s.substring(0, 8).equals("~SERVER~")){
            setForeground(Color.red);
        } else if (splitPipe[1].length() > 11 && (splitPipe[1].substring(0,12).equals("DEV Proskier") || splitPipe[1].substring(0,11).equals("DEV Sparkle"))){
            setForeground(Color.orange);
        } else {
            if (splitPipe[0].equals("(general")){
                setForeground(Color.black);
            } else if (splitPipe[0].equals("(whisper")){
                setForeground(Color.magenta);
            } else if (splitPipe[0].equals("(guild")){
                setForeground(Color.blue);
            } else if (splitPipe[0].equals("(global")){
                setForeground(Color.pink);
            }
        }
        return(this);
    }
}

chat modes

现在这完美无缺,但我想我不想在聊天中出现类型(一般),(耳语)等,只是颜色变化。很抱歉,如果这是一个非常简单的问题,我的大脑会因为焦点遍历垃圾而在聊天窗口工作时感到很痛苦。我曾经用它来切换聊天模式。

有一些简单的方法可以做到这一点??? 就像只切断前几个字符的子串,我可以使模式长度相同... aka(GEN),(GLO),(GUI),(WHI)

**** **** EDIT

我很感激帮助,但这对我来说是最简单的解决方案。如果这在某种程度上是坏的,请告诉我。

    if (splitPipe[0].equals("(general")){
        setText(splitPipe[1]);
        setForeground(Color.black);
    } else if (splitPipe[0].equals("(whisper")){
        setText(splitPipe[1]);
        setForeground(Color.magenta);
    } else if (splitPipe[0].equals("(guild")){
        setText(splitPipe[1]);
        setForeground(Color.blue);
    } else if (splitPipe[0].equals("(global")){
        setText(splitPipe[1]);
        setForeground(Color.pink);
    }

1 个答案:

答案 0 :(得分:2)

创建一个包含两段数据的自定义对象,消息类型和消息文本。将对象添加到ListModel。然后,您的渲染器可以检查类型是否突出显示,并将文本用于显示目的。

有关此方法的示例,请参阅:Java: Swing JComboBox, is it possible to have hidden data for each item in the list?。该示例使用组合框,但概念是相同的。