0

これは、(一般)、(ウィスパー)、(ギルド)、または (グローバル) のメッセージを追加するために使用している「プロトコル構文」です。

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

チャットモード

現在、これは完全に機能していますが、チャットにタイプ(一般)、(ささやき)などを表示したくないと思います。色の変更だけです。これが本当に簡単な質問でしたら申し訳ありませんが、チャット モードを切り替えるために使用したフォーカス トラバーサルのがらくたを使用してチャット ウィンドウで作業すると、頭が痛くなります。

これを行う簡単な方法はありますか?最初の数文字を切り落とす部分文字列のように、モードを同じ長さにすることができます... 別名 (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);
    }
4

1 に答える 1

2

メッセージのタイプとメッセージのテキストの2つのデータを含むカスタムオブジェクトを作成します。オブジェクトをListModelに追加します。次に、レンダラーは強調表示の目的でタイプをチェックし、表示の目的でテキストを使用できます。

参照:Java:Swing JComboBox、リスト内の各アイテムのデータを非表示にすることは可能ですか?このアプローチの例については。この例ではコンボボックスを使用していますが、概念は同じです。

于 2013-02-03T03:36:49.000 に答える