以编程方式在Java中生成Actionevent

时间:2011-07-23 12:45:57

标签: java awt

我正在制作一款应用。在java中,我有一个Button,我已经添加了一个actionlistener。它生成的ActionEvent(按钮)执行一些代码。现在我希望这段代码能够在应用程序运行时运行。开始而不按下按钮。我的意思是,我想生成Actionevent(不按下按钮),以便ActionPerformed包含的代码段作为app执行。开始。之后,只要按下按钮,它就可以运行。

4 个答案:

答案 0 :(得分:3)

只需使用构造函数,就可以像创建任何其他Java Object一样创建ActionEvent。然后,您可以使用Component.processEvent(..)

将它们直接发送到组件

然而,在这种情况下,我认为你最好将你的代码变成一个单独的函数,它被称为:

  • 按下按钮时按ActionListener
  • 直接由您的应用程序启动代码(如果您需要在事件处理线程上发生,可以使用SwingUtilities.invokeLater()或SwingUtilities.invokeAndWait())

通过这种方式,您不会将表示逻辑与代码所做的业务逻辑混淆....

答案 1 :(得分:2)

是的,它可以完成,但它确实没有意义,因为你的目标不是按下按钮或调用ActionListener的代码,而是按下按钮和程序启动时有一个共同的行为。对我来说,实现这一目标的最佳方法是让一个方法由ActionListener的actionPerformed方法和启动时的类调用。

这是一个简单的例子。在下面的代码中,一个方法禁用一个按钮,将JPanel变为绿色,并启动一个Timer,在2秒内启用该按钮并将JPanel的背景颜色重置为其默认值。导致此行为的方法在main类的构造函数和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();
         }
      });
   }
}

答案 2 :(得分:1)

通常,按钮操作事件响应外部事件,以通知应用程序用户(或者更确切地说是某人或某人)与应用程序交互。如果你的按钮执行了一些你想在应用程序启动时执行的代码,为什么不把它放在适当的位置呢?

示例:

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就不会冻结。

答案 3 :(得分:1)

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