JavaSwing:如何区分由用户触发的事件?
我想从不应该触发更改事件的代码中更新GUI元素(JavaSwing:如何区分由用户触发的事件?,java,swing,awt,Java,Swing,Awt,我想从不应该触发更改事件的代码中更新GUI元素(JComboBox,JLabel,等等)。是否可以从java.awt.event.ActionEvent或java.awt.event.ItemEvent中找出更改是由用户还是运行类似的代码引起的 combo.setSelectedItem("my item") 答案是:没有 但在某些情况下,您可以尝试分析当前的InputEvent。要获取它,请使用EventQueue.getCurrentEvent()。例如,如果用户在单击另一个组件时触发了更
JComboBox
,JLabel
,等等)。是否可以从java.awt.event.ActionEvent
或java.awt.event.ItemEvent
中找出更改是由用户还是运行类似的代码引起的
combo.setSelectedItem("my item")
答案是:没有
但在某些情况下,您可以尝试分析当前的
InputEvent
。要获取它,请使用EventQueue.getCurrentEvent()
。例如,如果用户在单击另一个组件时触发了更改,则可以比较输入事件的组件和操作事件的组件(好的,我知道:这是不安全的。但在某些情况下,这有助于避免增加应用程序的复杂性)。对于按钮,可以获得事件修饰符:
int buttonModifiers=evt.getModifiers()代码>
如果按钮事件是通过调用doClick()
生成的,则修饰符为0,否则为0
顺便说一下,通过使用evt.toString()
.不,至少,除非您可以设置某种标志,使事件处理程序能够忽略特定事件…谢谢,我认为会有更优雅的解决方案。当EventQueue.getCurrentEvent()
为空时,这意味着什么?事件在EDT线程中执行,对吗?或者使用SwingUtilities.invokeLater
可以解决这个问题吗?可能您在EDT中有没有计时器事件?通常,如果我通过按键或鼠标触发某个操作,我可以使用EventQueue.getCurrentEvent()获取该事件。好的,我已经解决了这个问题evt.getSource().getClass()
总是sun.awt.X11.XToolkit
,这不是很有帮助(evt
是java.awt.event.ItemEvent
)。哪个事件触发InputEvent
?