JavaSwing:如何区分由用户触发的事件?

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()。例如,如果用户在单击另一个组件时触发了更

我想从不应该触发更改事件的代码中更新GUI元素(
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