ItemListener.itemStateChanged(ItemEvent e)

时间:2012-08-13 19:35:21

标签: java swing jcombobox itemlistener

这个API的用途是什么?

几个月前我采用了它,考虑到我可以使用它来捕获ComboBox中的键盘和鼠标操作,以便在用户进行选择后调用业务逻辑。作为一名开发人员,我只使用鼠标,幸福无知,认为我的解决方案很好,直到测试人员介入并实际尝试使用带键盘的组合框。似乎itemStateChanged()对于改变项状态意味着什么是非常反直觉的(对我而言)。

当与鼠标一起使用时,用户可以使用鼠标移动到下拉列表,并使用下拉列表突出显示当前包含鼠标光标但不生成事件的组合框条目。当用户实际点击某个项目时会生成该事件。这非常直观,也是我所期待的。

另一方面,使用键盘,每次按下向下箭头都会生成itemStateChanged事件。这是违反直觉的,而不是我想要的。我想仅在用户通过按下输入键信号表明已经做出选择来表示他的选择时产生一个事件 - 即鼠标点击的模拟,而不是鼠标移动的模拟。有没有办法让组合框以这种方式运行,或者我不能使用itemStateChanged来捕获这些事件?

我还应该补充说,ItemEvent本身不包含任何可以帮助我消除歧义情况的内容。

更新:好的,这是问题的核心:如何使Swing处理组合框的下拉列表中的向下箭头,相当于将鼠标移动到下拉列表的元素中? ItemListener和ActionListener都将箭头键操作视为“选择”而不是导航。而我希望键盘类似于鼠标。我们的要求是使一切都能与键盘配合使用。鼠标是一个很好的,这个应用程序的有经验的用户将不会使用太多。

2 个答案:

答案 0 :(得分:1)

根据Javadoc itemStateChanged(ItemEvent e)在用户选择或取消选择项目时调用。而你所看到的是完全相同的行为。使用箭头键,对于按下的每个键,您可以有效地从组合中选择(并同时取消选择)一个特定项目。

根据您的情况,我认为您应该考虑将您的业务逻辑作为JButton的一部分,将服务器作为用户选择的确认,或尝试在FocusListenerJComboBox并将您的逻辑作为public void focusLost(FocusEvent e)的一部分。 Here's a tutorial可帮助您更好地了解FocusListener

答案 1 :(得分:0)

来自JComboBox文档

  当所选项目发生变化时,

aListener将收到一个或两个ItemEvent

现在,我将成为第一个表示措辞有点轻松的人,但这就是说,当用户选择和项目(从下拉列表中)时,您将至少收到一次通知,可能两次。

您真正想要使用的是ActionListener

  

ActionListener将在完成选择后收到ActionEvent。如果组合框是可编辑的,则在编辑停止时将触发ActionEvent。