【发布时间】:2015-02-23 01:10:12
【问题描述】:
我一直在尝试确定为什么我的 JComboBox 通过大量 Google 搜索显示列表中的第一项,但我很难找到相关帮助。可能是我不知道正确的术语(因此这个问题的标题过于具体),因此找不到可以解释我的问题的信息。我检查了 JComboBox API,以及它使用的一些侦听器和模型,但它们似乎不太可能成为候选人。
有问题的 JComboBox 在 JTable 中,所以我不知道这是否会改变它的默认行为。我使用的代码如下:
//row and col are final due to usage inside anonymous inner class
public TableCellEditor getCellEditor(final int row, final int col)
{
String[] listItems = new String[arrayList.getSize()];
int i = -1;
for(String s : arrayList)
{
i++;
listItems[i] = s;
}
JComboBox<String> box = new JComboBox<>(listItems);
box.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange() == ItemEvent.SELECTED)
{
if(e.getItem().equals("Add/Edit Projectile"))
{
//Where Editor is a JFrame that will be opened
new Editor();
}
}
}
});
DefaultCellEditor list = new DefaultCellEditor(box);
}
请注意,我的程序中的 Arraylist 不包含字符串,而是一组更复杂的自定义对象,我认为这会分散主要问题的注意力。
我没有在 JTable 中包含 JComboBox 的渲染器,因为我对它的出现方式感到非常满意,并且认为我的问题更多是我忽略了在模型中实现/实现的错误。
我还提供了一些屏幕截图来更好地描述我的问题。第一个图像是未选择 JComboBox 时的图像,仅显示当前选定的项目。
第二张图片是当我刚刚单击 JComboBox 以显示列表时。如图所示,无论它是什么,它都会立即调出第一个项目。
如果有人对在哪里查看/解决方案有任何建议,我将不胜感激。
编辑
我的特定表有两列,其中左列是变量名,右列是与变量关联的值。表格的作用是显示选定对象的属性,其中不同对象的不同变量的每个值可能不一样。
在这种特殊情况下,单元格显示一个 JComboBox,其中包含我们正在制作的游戏中的所有可用 Projectiles。每个敌人都有不同类型的默认投射物。因此,当我在我们的游戏区域中单击不同的敌人时,表格将显示它们当前的所有属性(如果它们没有被更改,则为默认值)。
敌人确实有一个用于射弹的吸气剂,所以我可以确定当前选择的敌人是什么,获取它的射弹,执行 toString() 以查找它在列表中的表示方式,然后执行 setValueAt() .
目前唯一的问题是,当列表展开时,它总是选择列表中的第一项。
【问题讨论】:
-
首先,不要使用
ItemListener in theCellEditor, add aTableModelListener` 到TableModel并监视单元格值的更改。其次,JComboBox还应该显示什么?您尚未将所选值设置为任何值... -
我将切换到 TableModelListener。这样做有什么特别的好处,不管它们是否与我的问题有关?总是很高兴学习更好的编程实践!该表实际上应该只显示列表中每个项目中表示的自定义对象的 toString()。唯一需要跟踪的事件是单击“添加/编辑弹丸”项目时,因为这需要调出一个新的 JDialog。除此之外,它们只是后端数据的简单表示。
-
主要原因是,当用户做出选择时,决定应该发生什么不是编辑器或模型的责任。编辑器负责允许用户选择或更改单元格的值,模型负责管理数据
-
这很有道理,我会记住这一点,以备将来实施。我还将确保更改当前表的实现,使其符合此范例。非常感谢你!
标签: java swing jtable jcombobox jlist