在Java中编程生成ActionEvent

3

我正在用Java制作一个应用程序,其中有一个按钮,我已经添加了一个actionlistener。它(按钮)生成的ActionEvent执行一些代码。现在我想让这段代码在应用程序启动时运行,而不需要按下按钮。我的意思是,我想生成Actionevent(无需按下按钮),以便包含在ActionPerformed中的代码片段在应用程序启动时得到执行。之后,只要我按下按钮,它就可以运行。

4个回答

3
您可以像创建任何其他Java对象一样使用构造函数创建ActionEvents,然后可以直接使用Component.processEvent(..)将它们发送到组件。
但是,在这种情况下,我认为您最好将代码制成单独的函数,该函数在以下两种情况下都被调用:
1.当按下按钮时由ActionListener调用
2.直接由应用程序启动代码调用(如果需要在事件处理线程上执行,则可能使用SwingUtilities.invokeLater()或SwingUtilities.invokeAndWait())
这样,您就不会混淆演示逻辑与代码所做的任何业务逻辑。

2
是的,这是可以实现的,但这并不是很有意义,因为您的目标不是按下按钮或调用ActionListener的代码,而是在按下按钮和程序启动时具有共同的行为。对我来说,实现这一点的最佳方法是拥有一个方法,该方法由ActionListener的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();
         }
      });
   }
}

1
通常,按钮动作事件响应外部事件,以通知应用程序用户(或某物或某人)与应用程序进行了交互。如果您的按钮执行一些代码,您希望在应用程序启动时也执行该代码,为什么不将所有内容放置在其适当位置呢? < p > < em > 示例:
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按钮事件中使用一个单独的线程,这样你的应用程序界面就不会冻结。


不,Mikera并没有建议在代码执行时间较长时使用SwingUtilities(这会暗示需要使用SwingWorker),而是建议如果您在程序启动时且不在事件线程上调用代码,则将其排队到事件线程上使用SwingUtilities.invokeLater(..) - Hovercraft Full Of Eels
1
你说得对,重新阅读了他的回答后,我编辑了那一段。 - Yanick Rochon

1

只需调用 JButton.doClick(),它就会触发与JButton关联的ActionEvent。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接