gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:18:05 25 4
gpt4 key购买 nike

这是我用来添加类型(常规)、(耳语)、(行会)或(全局)消息的“协议(protocol)语法”

// 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

现在这工作得很好,但是我想我不希望类型(一般)、(耳语)等出现在聊天中,只是颜色改变。抱歉,如果这是一个非常简单的问题,我的大脑因在聊天窗口上工作而受到伤害,焦点遍历垃圾我用来切换聊天模式。

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

****编辑****

我很感谢您的帮助,但这对我来说是最简单的解决方案。如果这在某些方面有问题,请告诉我。

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

最佳答案

创建一个自定义对象,其中包含两条数据:消息类型和消息文本。将对象添加到 ListModel。然后,您的渲染器可以检查类型以突出显示,并使用文本进行显示。

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

关于java - 通过自定义 ListCellRendered 隐藏 JList 字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14669211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com