每次单击/更改任何选项时,我都试图编辑显示的文本(在 JComboBox 本身,而不是选项的下拉弹出窗口中)。
我有一个自定义渲染器,看起来有点像下面的:
JComboBox<Object> jc = new JComboBox<Object>();
jc.setRenderer(new ListCellRenderer<Object>() {
@Override
public Component getListCellRendererComponent(JList<? extends Item> list,
Object value, int index,
boolean isSelected,
boolean cellHasFocus) {
if(index == -1)
return new JLabel("this is the top cell");
return new JLabel("this is a cell in the dropdown popup area");
}
});
每当调用渲染器时,这会成功更改文本。问题是每次单击条目时都不会调用此渲染器。
我曾尝试在我的类中进行自定义事件调用以扩展 JComboBox,但是在尝试调用更改时,我不确定如何指定我只想更改顶部文本(并保留下拉列表的其余部分单独的细胞)。我一直在搞乱方法:
fireItemStateChanged(new ItemEvent(this,ItemEvent.ITEM_STATE_CHANGED,
somethingGoesHere,
ItemEvent.DESELECTED));
但我不知道要用什么项目对象代替
somethingGoesHere
来指定调用重新渲染到顶部文本。 dataModule.getElementAt(int index)
中的所有条目似乎都没有创建更改正确文本的调用。
(我的 JComboBox 扩展类进行了较大的更改,包括使下拉弹出窗口在单击选项时不会自动隐藏,这可能是顶部文本没有像预期的那样频繁更改的原因,我正在尝试调用渲染器靠我自己。)
编辑:
经过一些测试,问题是即使再次单击先前选择的下拉项,我也希望 JComboBox 显示位刷新。
我尝试覆盖
setSelectedItem(Object anObject)
以调用 selectedItemChanged()
,即使在 selectedItemReminder == dataModule.getSelectedItem()
时也是如此,但这不会强制更新 JComboBox 显示文本。 :(
我想我明白了!
我需要显式调用的事件是 DefaultComboBoxModel 中的
fireContentsChanged(this, -1, -1)
,所以我将 that 类扩展到自定义模型中,这样我的 JComboBox 扩展可以告诉模型运行该方法。这成功地强制 ListCellRenderer 更新我正在尝试更改的显示文本。
DefaultComboBoxModel 通常是从模型的
setSelectedItem(Object anObject)
方法调用更新 JComboBox 的显示文本的模型。