【发布时间】:2011-10-28 08:28:38
【问题描述】:
在我的项目中,我有几个带有自定义模型的 JComboBox。基本上它们用于显示一些 JTables 列的值(因此我决定在相对的 类扩展 AbstractTableModel)。
public class MyTableModel1 extends AbstractTableModel{
protected class MyTableComboBoxModel1 extends AbstractListModel implements ComboBoxModel{
private Object selected;
@Override
public Object getElementAt(int index) {
return getValueAt(index, 1);
}
@Override
public int getSize() {
return getRowCount();
}
@Override
public Object getSelectedItem() {
return this.selected;
}
@Override
public void setSelectedItem(Object anItem) {
this.selected = anItem;
}
}
}
我有几个模型:MyTableModel2 和 MyTableComboBoxModel2。这些模型都做了几乎相同的事情,除了一些与组合框和表格本身无关的额外操作。
所有这些东西的目的应该是根据对相关 JTable 的修改相应地更新 JComboBox 的显示值。
除了一种情况外,对于我已经实现的模型,一切都很好,经过几个小时的调试,我仍然无法解决它。错误模型的代码几乎与其他模型相同。可能是我代码中其他地方的错误,但我不知道在哪里。
错误的情况有以下行为:当我最初创建一个包含一些值的表时,这些值即使在 JComboBox 中也能正确显示,但是当我添加新行时,显示的值变为全空白(显示的空白菜单的大小是对的)。 我发现:
- jtable 的新行添加正确。
- getElementAt 方法在单击 JComboBox 时被多次调用并返回所有可用值(包括新值)。
- 当我点击 JComboBox 并返回正确的更新值时调用 getSize() 方法
- 如果 JComboBox 有焦点,我可以使用箭头选择可用项目,并且所有项目都是可选的(甚至是添加的项目)。
- 如果我使用鼠标在显示的空白菜单上随机单击一个点,则可以选择所有最后一个可用条目。
有人知道吗?你能建议我在这种情况下如何调试吗?不幸的是,我无法发布 SSCCE .. 我希望有人可以提供帮助..
【问题讨论】:
-
添加项目后可能会调用combo.revalidate()。
-
@toto: 我试过但重新验证没有解决问题
-
试过不同的平台?还是不同的外观?
-
@toto:即使改变外观和感觉也没有任何改变
-
这个想法对我有用stackoverflow.com/questions/6261017/…,但是你编码的东西太难了,如果 TableCell 失去焦点,你忘记从 JComboBox 中删除的侦听器之间可能存在冲突,:-) 没有办法sscce :-)
标签: java debugging swing jcombobox comboboxmodel