2

これは私のコードです:-

public class MyRender extends JPanel implements ListCellRenderer {

    ImageIcon on_img;
    JLabel name = new JLabel();
    JLabel icn = new JLabel();
    JLabel img = new JLabel();

    public MyRender(Atalk) {
        setOpaque(true);
        setBackground(Color.WHITE);
        setForeground(Color.black);
        on_img = new ImageIcon(MyCls.class.getClassLoader().getResource("imgPath"));
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        if (value != null) {
            removeAll();
            setLayout(new BorderLayout());
            User user = (User) value;
            String pres = user.getPresence().toLowerCase();
            img.setIcon(default_img);
            if (pres.contains("unavailable"))
                icn.setIcon(off_img);
            else
                icn.setIcon(on_img);
            name.setText(user.getName());
            JPanel panel = new JPanel();
            panel.setLayout(new BorderLayout());

            add(img, BorderLayout.EAST);
            add(icn, BorderLayout.WEST);

            panel.add(st, BorderLayout.CENTER);
            panel.add(name, BorderLayout.NORTH);

            add(panel, BorderLayout.CENTER);

            JLabel lbl = new JLabel(" ");
            lbl.setSize(100, 5);
            add(lbl, BorderLayout.AFTER_LAST_LINE);

            if (isSelected) {
                setBackground(Color.lightGray);
                panel.setBackground(Color.lightGray);
            } else {
                setBackground(Color.white);
                panel.setBackground(Color.white);
            }

            return this;
        }
        return null;
    }
}

ご覧のとおり、removeAll()メソッドを呼び出しました。その行を削除すると、データが正しく表示されません。すべてのデータが互いにオーバーラップしています。そして、私が追加すれば、removeAll()すべてうまくいきます。なぜこれが起こるのですか?電話する必要がありますremoveAll()か?

4

3 に答える 3

4

のすべての子がMyRender構築時に作成および追加されるように、クラスを再構築する必要があります。

getListCellRendererComponent()既存のコンポーネントの値または視覚的属性(背景など)を変更する場合にのみ使用してください。

これは可能な限り高速である必要があることを忘れないでくださいgetListCellRendererComponent()(非常に頻繁に呼び出すことができます)。したがって、コンポーネントを作成するのではなく、既存のコンポーネントのみを変更する必要があります。

通常、getListCellRendererComponent()メソッドは次のようになります。

@Override
public Component getListCellRendererComponent(
    JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    if (value != null) {
        User user = (User) value;
        String pres = user.getPresence().toLowerCase();
        img.setIcon(default_img);
        if (pres.contains("unavailable"))
            icn.setIcon(off_img);
        else
            icn.setIcon(on_img);
        name.setText(user.getName());
        if (isSelected) {
            setBackground(Color.lightGray);
            panel.setBackground(Color.lightGray);
        } else {
            setBackground(Color.white);
            panel.setBackground(Color.white);
        }
    }
    return this;
}
于 2011-05-18T11:45:34.073 に答える
1

いいえ、removeAll()を呼び出す必要はありません。あなたの問題は、メソッドがここで呼び出されるたびに、getListCellRendererComponentメソッド内に新しいJPanelを作成していることだと思います。

JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());

このJPanelをクラスフィールドにした場合、removeAllを呼び出す必要はないでしょう。

編集:jfpoilpretによってよりよく答えられました。彼に1+。

于 2011-05-18T13:08:13.817 に答える
0

revalidate()パネルでも使用

于 2011-05-18T10:19:40.320 に答える