我正在用Java制作一个应用程序,其中有一个按钮,我已经添加了一个actionlistener。它(按钮)生成的ActionEvent执行一些代码。现在我想让这段代码在应用程序启动时运行,而不需要按下按钮。我的意思是,我想生成Actionevent(无需按下按钮),以便包含在ActionPerformed中的代码片段在应用程序启动时得到执行。之后,只要我按下按钮,它就可以运行。
以下是一个简单的示例。 在下面的代码中,一个方法禁用了一个按钮,将JPanel变为绿色,并启动一个计时器,在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
按钮事件中使用一个单独的线程,这样你的应用程序界面就不会冻结。
只需调用 JButton.doClick(),它就会触发与JButton关联的ActionEvent。
SwingWorker
),而是建议如果您在程序启动时且不在事件线程上调用代码,则将其排队到事件线程上使用SwingUtilities.invokeLater(..)
。 - Hovercraft Full Of Eels