這是我的代碼: -爲什麼在ListCellRenderer中需要removeAll()?
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()
?
通常情況下,你不需要那樣做。但這取決於你在JPanel中放置了什麼。顯示更多代碼可能會很有用,特別是構造函數和getListCellRenderer的其餘部分。 – jfpoilpret 2011-05-18 10:08:52
還要注意你的方法不應該返回null。 – jfpoilpret 2011-05-18 10:09:31
@jfpoilpret:用類代碼更新了我的問題。 – 2011-05-18 10:16:32