gpt4 book ai didi

java - 为什么在 ListCellRenderer 中需要 removeAll()?

转载 作者:行者123 更新时间:2023-11-30 06:35:28 28 4
gpt4 key购买 nike

这是我的代码:-

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()

最佳答案

您必须重构您的类,以便在构造时创建和添加 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;
}

关于java - 为什么在 ListCellRenderer 中需要 removeAll()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6042955/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com