gpt4 book ai didi

java - 修改 ComboBox 在 Swing 中的显示

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:54:05 40 4
gpt4 key购买 nike

我想修改(不可编辑的)JComboBox 的显示方式,使当前选定的条目在编辑字段中有一些额外的文本(不是下拉列表)。

像这样:

Mockup

我的第一个猜测是覆盖 ComboBox 的模型,以便 getSelectedItem 返回一个修改显示的包装器对象:

petList.setModel(new ComboBoxModel() {
private Object selected;

public void setSelectedItem(Object anItem) {
selected = anItem;
}

public Object getSelectedItem() {
return new ActiveComboItem(selected);
}

// … The rest of the methods are straightforward.
});

ActiveComboItem 如下所示:

static class ActiveComboItem {
private final Object item;

public ActiveComboItem(Object item) { this.item = item; }

@Override
public boolean equals(Object other) {
return item == null ? other == null : item.equals(other);
}

@Override
public String toString() { return String.format("Animal: %s", item); }
}

确实,就修改显示而言,这很有效。不幸的是,当前条目不再标记为 Activity :

Wrong display

(请注意缺少的复选标记……或者您的操作系统会显示选择。)

进一步检查表明,每次用户在框中选择一个新项目时,都会调用模型的 getElementAt 方法,索引为 -1。这是使用修改后的选定项时的情况。当模型的 getSelectedItem 方法返回不带包装器的普通对象时,则在下拉框中将所选项目标记为已选中,而 getElementAt 不是使用参数 -1 调用。

显然,ComboBox 正在将每个项目依次与当前 Activity 项目进行比较,但是,尽管我重写了 equals 方法,但它找不到匹配项。 我该如何解决这个问题?

(此问题的完整可编译代码 at gist.github.com )

最佳答案

您需要提供自定义的 ListCellRenderer。以下作品:

    final JComboBox animalCombo = new JComboBox(animals);
animalCombo.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(final JList list, Object value, final int index, final boolean isSelected,
final boolean cellHasFocus) {

if (index == -1) {
value = "Animal: " + value;
}

return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
});

当其绘制的值不在下拉列表中时,index 为 -1。

供将来引用,当您只想更改某些内容在 Swing 中的显示方式时,您永远不想修改支持模型。每个组件都有一个渲染器,一般只需要对默认渲染器稍作修改即可。

关于java - 修改 ComboBox 在 Swing 中的显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7732331/

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