【发布时间】:2011-08-27 22:17:58
【问题描述】:
这是我的代码:-
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 的其余部分。
-
另请注意,您的方法永远不应返回 null。
-
@jfpoilpret:用类代码更新了我的问题。
-
@ Harry Joy ... 真的不要,removeAll() 是 Action 的工作(包括 JPanel 的paintBorder)和 ListCellRendered 默认返回 JLabel,现在我的问题 1)由 JButton Action 你' d 更改 JList 内容并且 JList 包含 JLabel + Icon + ImageIcon 2)只有一个 JList 或多个 JList 3)我们在谈论 JList
-
@mKorbel: Answers:1) 是的,Jlist 包含 JPanel,其中包括 JLabel、ImageIcon,我稍后还会对 JList 执行操作。 2) 共有 4 个 Jlist,但所有共享都拥有
new MyRender()。 3) 是的。不要在@和`人名`之间使用空格,它不会通知那个人。
标签: java swing listcellrenderer