0

こんにちは、要素として sJListを含むa を実装しました。JLabel私の目的は、サーバー/クライアント チャット アプリケーションの連絡先リストを実装することです。したがって、クライアントがサーバーに接続すると、JList がビルドされて連絡先リストが表示されます。JLabels を使用することを選択したのは、アイコンとテキストも含めることができるためです。ただし、オーバーライドされた cellrenderer メソッドについて問題が発生しています。クライアントがオンライン/オフラインになるたびに、JList はその状態を更新し、最後に追加されたアイテムと同様のすべてのアイテムを設定します。こんな感じで、

オフライン状態のクライアントをユーザーのフレンド リストに追加するのはこれが初めてです。

ここに画像の説明を入力

その後、別のクライアントを追加するのは 2 回目です。

ここに画像の説明を入力

そしてついに3回目…

ここに画像の説明を入力

さらに、チュートリアルでは、JList オーバーライドのペイン メソッドについて言及し、リストに変更があったときに要素全体を何度も描画することを覚えています。実際、私はこのレンダリングの主題について初心者であり、これは非常に面倒です。ここに私のレンダラー クラスが表示されます。 レンダラーサンプル

メインクラスでこのようにモデルに要素を追加します

labelSetText = tempon.getNickName();
onlineStatus = tempon.isIsOnline();
model.addElement(createPanel());

またcreatePanel()、次のような JLabel を返します。

public static JLabel createPanel() {
    JLabel panel = new JLabel();
    return panel;
}

私の問題について明確になったことを願っています。連絡先が状態を変更したとき、または連絡先が追加されたときに、このアクションが他の要素に影響を与えないようにする必要があります。私はすべての答えに非常に感謝しています(また、あなたが何をなぜしたかについての簡単な説明を追加できれば、私は感謝します.) とにかくありがとう

4

1 に答える 1

4

JLabelなどのコンポーネントを に入れるべきではありませんJList。代わりに、モデルを使用してデータを保持し、レンダラーを追加してプレゼンテーションをカスタマイズします。いくつかの例については、リストの使用方法を参照してください。

アイコンを追加するレンダラーの非常に基本的な例を次に示します。

import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.*;

public class TestUserList {
    public static class UserRenderer extends DefaultListCellRenderer {
        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean hasFocus) {
            if (value instanceof UserEntry) {
                UserEntry user = (UserEntry) value;
                JLabel label = (JLabel) super.getListCellRendererComponent(
                        list, user.getName(), index, isSelected, hasFocus);
                if (user.isOnline())
                    label.setIcon(UIManager
                            .getIcon("OptionPane.informationIcon"));
                else
                    label.setIcon(UIManager.getIcon("OptionPane.errorIcon"));
                return label;
            }
            return super.getListCellRendererComponent(list, value, index,
                    isSelected, hasFocus);
        }
    }

    public TestUserList() {
        JFrame frame = new JFrame("User List");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JList list = new JList();

        JScrollPane scrollPane = new JScrollPane(list);
        JPanel content = new JPanel(new BorderLayout());
        content.add(scrollPane, BorderLayout.CENTER);
        final DefaultListModel model = new DefaultListModel();
        model.addElement(new UserEntry("John", true));
        model.addElement(new UserEntry("Jesse", false));
        list.setModel(model);

        list.setCellRenderer(new UserRenderer());

        frame.add(content);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    public class UserEntry {
        private String name;
        private boolean online;

        public UserEntry(String name, boolean online) {
            super();
            this.name = name;
            this.online = online;
        }

        public String getName() {
            return name;
        }

        public Boolean isOnline() {
            return online;
        }
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestUserList();
            }
        });
    }
}
于 2013-03-29T00:12:34.993 に答える