繁体   English   中英

以编程方式在Java中生成Actionevent

[英]Programmatically Generating Actionevent in Java

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

只需使用构造函数,就可以像创建任何其他Java对象一样创建ActionEvent。 然后你可以使用Component.processEvent(..)将它们直接发送到组件

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

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

这样你就不会将表示逻辑与代码所做的业务逻辑混淆在一起....

是的,它可以完成,但它确实没有意义,因为你的目标不是按下按钮或调用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();
         }
      });
   }
}

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

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

例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM