如何以编程方式将ActionEvent发送到JButton?

Ano*_*non 14 java swing event-handling jbutton actionlistener

如何以编程方式发送ActionEvent(例如按下按钮/ ACTION_PERFORMED)到JButton

我知道:

button.doClick(0);
Run Code Online (Sandbox Code Playgroud)

button.getModel().setArmed(true);
button.getModel().setPressed(true);
button.getModel().setPressed(false);
button.getModel().setArmed(false);
Run Code Online (Sandbox Code Playgroud)

但是不是可以直接发送它ActionEvent吗?

编辑:这不是生产代码,它只是一个小小的个人实验.

jjn*_*guy 15

你可以得到一个按钮ActionListener,然后actionPerformed直接调用该方法.

ActionEvent event;
long when;

when  = System.currentTimeMillis();
event = new ActionEvent(button, ActionEvent.ACTION_PERFORMED, "Anything", when, 0);

for (ActionListener listener : button.getActionListeners()) {
    listener.actionPerformed(event);
}
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的一点是,ActionListeners通常认为它们将在EDT上调用,因此如果您要手动调度它们,您也希望在EDT上执行此操作. (4认同)
  • 这里有*记录*:http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html#event_dispatching*一旦GUI可见,大多数程序都是由按钮动作等事件驱动的.鼠标点击,**总是在事件派发线程中处理*从那里我们可以假设它们在EDT中运行. (4认同)

Mar*_*ers 13

即使你可以,你为什么要这样做?通常当人们想要做这样的事情时,这意味着他们没有正确地 UI 的关注点与业务逻辑分开.通常,他们希望调用ActionListener中发生的某些逻辑,而无需执行操作.

public void actionPerformed(ActionEvent ae) {
    //SomeLogic
}

//...

public void someOtherPlace() {
    //I want to invoke SomeLogic from here though!
}
Run Code Online (Sandbox Code Playgroud)

但实际上解决方案是从ActionListener中提取该逻辑并从ActionListener和第二个位置调用它:

public void someLogic() {
    //SomeLogic
}

public void actionPerformed(ActionEvent ae) {
    someLogic();
}

//...

public void someOtherPlace() {
    someLogic();
}
Run Code Online (Sandbox Code Playgroud)