gpt4 book ai didi

java - 创建一个看起来像默认的 ListCellRenderer?

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:40 26 4
gpt4 key购买 nike

要为任意对象自定义 JComboBox 中显示的文本,我知道正确的方法是创建自定义 ListCellRenderer 。但是,我不确定如何以模仿与普通组合框相同的外观和感觉的方式执行此操作。

考虑下面的 SSCCE。它可以工作,但有一个令人不快的行,其中我将一个组件转换为 JLabel。这是我不应该拥有也不应该依赖的魔法知识。有没有其他方法可以在不做如此难看的事情的情况下获得相同的效果?

public class ListCellRendererExample {

private final JFrame frame;

public ListCellRendererExample() {
frame = new JFrame();

JComboBox<SomeObject> combobox = new JComboBox<>(
new SomeObject[] { new SomeObject("a") });

ListCellRenderer<? super SomeObject> cellRenderer = combobox.getRenderer();
combobox.setRenderer(new CustomRenderer(cellRenderer));

frame.add(combobox);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
new ListCellRendererExample();
}

private class CustomRenderer implements ListCellRenderer<SomeObject> {

private final ListCellRenderer<? super SomeObject> defaultRenderer;

public CustomRenderer(ListCellRenderer<? super SomeObject> cellRenderer) {
this.defaultRenderer = cellRenderer;
}

@Override
public Component getListCellRendererComponent(
JList<? extends SomeObject> list, SomeObject value, int index,
boolean isSelected, boolean cellHasFocus) {
Component result = defaultRenderer.getListCellRendererComponent(list,
value, index, isSelected, cellHasFocus);

((JLabel) result).setText(value.value); // <--- URGH!
return result;
}
}

private static class SomeObject {
private final String value;

public SomeObject(String nombre) {
this.value = nombre;
}
}
}

最佳答案

如果您想避免强制转换,为什么不让自定义 ListCellRenderer 以与默认 ListCellRenderer 相同的方式扩展 JLabel。

参见示例here .

关于java - 创建一个看起来像默认的 ListCellRenderer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18904250/

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