【问题标题】:ItemListener.itemStateChanged(ItemEvent e)ItemListener.itemStateChanged(ItemEvent e)
【发布时间】:2012-08-13 19:35:21
【问题描述】:

这个 API 有什么用?

几个月前我采用了它,当时我的想法是,一旦用户做出选择,我就可以使用它来捕获 ComboBox 中的键盘和鼠标操作,从而调用业务逻辑。作为一名开发人员,我只使用鼠标,幸福地无知,认为我的解决方案很好,直到测试人员参与进来,并实际尝试使用带有键盘的组合框。似乎 itemStateChanged() 对更改项目状态的含义有一种非常违反直觉的(无论如何对我来说)感觉。

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

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

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

更新:好的,这是问题的核心:如何让 Swing 将向下箭头通过组合框的下拉列表视为等同于在下拉列表的元素中移动鼠标? ItemListener 和 ActionListener 都将箭头键操作视为“选择”而不是导航。而我希望键盘类似于鼠标。我们的要求是让一切都可以使用键盘。鼠标是一个很好的工具,有经验的用户不会使用这个应用程序。

【问题讨论】:

    标签: java swing jcombobox itemlistener


    【解决方案1】:

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

    对于您的情况,我认为您应该考虑将您的业务逻辑作为JButton 的一部分来实现,该服务器作为对用户选择的确认,或者尝试在JComboBox 上使用FocusListener 并将您的逻辑作为一部分的public void focusLost(FocusEvent e)Here's a tutorial 帮助您更好地了解FocusListener

    【讨论】:

    • 按钮不可行。 FocusListener 可能是。
    • 看起来低级监听器是唯一可行的,因为 Swing 坚持将箭头键与鼠标悬停在下拉列表上不同。我必须通过相同的代码将鼠标单击 (MouseListener) 和 Enter 按键 (keyListener) 集中起来,否则将关闭 FocusListener。有点丑。
    • 我必须实现 MouseListener、KeyListener 和 FocusListener 才能处理所有情况,但现在它运行良好。我回到我原来的问题:ItemListener 有什么用? Java 似乎在这里混合了选择和导航。
    【解决方案2】:

    来自JComboBox 文档

    Alistener将在所选项目更改时会收到一个或两个itemEvents

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

    你真正想要使用的是ActionListener

    当做出选择时,ActionListener 将收到一个 ActionEvent。如果组合框是可编辑的,那么当编辑停止时会触发一个 ActionEvent。

    【讨论】:

    • 嗯。我得出了同样的结论,并根据 ActionListener 重新实现。唉!它不起作用。按箭头键会生成一个动作事件。
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2015-05-19
    • 2012-11-17
    • 2021-11-12
    相关资源
    最近更新 更多