【发布时间】:2017-12-08 21:34:54
【问题描述】:
我正在制作一个应用程序。在 java 中,其中有一个按钮,我添加了一个 actionlistener。它(按钮)生成的 ActionEvent 执行一些代码。现在我希望这段代码在应用程序时运行。启动,无需按下按钮。我的意思是,我想生成 Actionevent(不按下按钮),以便 ActionPerformed 包含的代码片段作为应用程序执行。开始。之后,只要我按下按钮,它就会运行。
【问题讨论】:
我正在制作一个应用程序。在 java 中,其中有一个按钮,我添加了一个 actionlistener。它(按钮)生成的 ActionEvent 执行一些代码。现在我希望这段代码在应用程序时运行。启动,无需按下按钮。我的意思是,我想生成 Actionevent(不按下按钮),以便 ActionPerformed 包含的代码片段作为应用程序执行。开始。之后,只要我按下按钮,它就会运行。
【问题讨论】:
您可以像任何其他 Java 对象一样通过使用构造函数来创建 ActionEvent。然后你可以使用 Component.processEvent(..) 直接将它们发送到组件
但是,在这种情况下,我认为您最好将代码放入一个单独的函数中,该函数同时调用:
这样您就不会将表示逻辑与代码所做的任何业务逻辑混为一谈......
【讨论】:
是的,它可以做到,但它没有真正意义,因为你的目标不是按下按钮或调用 ActionListener 的代码,而是在按钮按下和程序启动时有一个共同的行为.对我来说,实现这一点的最佳方法是拥有一个由 ActionListener 的 actionPerformed 方法和启动时的类调用的方法。
这是一个简单的例子。在下面的代码中,一个方法禁用一个按钮,将 JPanel 变为绿色,并启动一个 Timer,该计时器在 2 秒内启用该按钮并将 JPanel 的背景颜色重置为其默认值。在主类的构造函数和 JButton 的 ActionListener 的 actionPerformed 方法中都会调用导致此行为的方法:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ActionOnStartUp extends JPanel {
private static final int PANEL_W = 400;
private static final int PANEL_H = 300;
private static final int TIMER_DELAY = 2000;
private JButton turnGreenBtn = new JButton("Turn Panel Green for 2 seconds");;
public ActionOnStartUp() {
turnPanelGreen();
turnGreenBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
turnPanelGreen();
}
});
add(turnGreenBtn);
}
public void turnPanelGreen() {
setBackground(Color.green);
turnGreenBtn.setEnabled(false);
new Timer(TIMER_DELAY, new ActionListener() {
public void actionPerformed(ActionEvent ae) {
setBackground(null);
turnGreenBtn.setEnabled(true);
((Timer) ae.getSource()).stop(); // stop the Timer
}
}).start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PANEL_W, PANEL_H);
}
public static void createAndShowGui() {
JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ActionOnStartUp());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
【讨论】:
通常,按钮操作事件响应外部事件,以通知应用程序用户(或者更确切地说是某物或某人)与应用程序交互。如果你的按钮执行了一些你想在应用程序启动时也执行的代码,为什么不把所有东西都放在合适的地方呢?
例子:
public class SomeSharedObject {
public void executeSomeCode() { /*....*/ }
}
用类似的东西设置按钮
public void setButtonAction(final SOmeSharedObject obj) {
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
obj.executeSomeCode();
}
});
}
并在应用程序开始时运行
public void initApplication(SomeSharedObject obj) {
obj.executeSomeCode();
}
而且,如果您需要执行的代码需要一段时间才能完成,您可能希望在 actionPerformed 按钮事件中使用单独的线程,这样您的应用程序 UI 就不会冻结。
【讨论】:
SwingWorker),Mikera 没有声明要使用 SwingUtilities,而是使用 @ 在事件线程上排队代码987654326@ 如果您在程序启动时调用它并且关闭事件线程。
只需调用 JButton.doClick(),它应该会触发与 JButton 关联的 ActionEvent。
【讨论】: