簡體   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