2011-07-23 48 views
3

我在製作一個App。在java中,其中有一個Button,我添加了一個actionlistener。它(按鈕)產生的ActionEvent執行一些代碼。現在,我希望這段代碼在應用程序運行時運行。開始並且不按下按鈕。我的意思是,我想生成Actionevent(無需按下按鈕),以便ActionPerformed包含的代碼作爲應用程序執行。開始。之後,只要按下按鈕,它就可以運行。以編程方式生成Java中的Actionevent

回答

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(); 
     } 
     }); 
    } 
} 
3

您可以創建這樣只要使用構造任何其他Java對象是ActionEvent。然後你就可以直接發送到組件與Component.processEvent(..)

然而,在這種情況下,我認爲你是更好地使你的代碼放到一個單獨的函數被調用這兩個:

  • 通過當按鈕被按下
  • 直接通過您的應用程序的啓動代碼(使用SwingUtilities.invokeLater()或SwingUtilities.invokeAndWait()可能性,如果你需要它的事件處理線程上發生)的ActionListener的

這樣喲你不要將表示邏輯與任何代碼的業務邏輯混合在一起......

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();  
} 

而且,如果你的代碼需要執行需要一段時間才能完成,您可能會wa。 nt在您的actionPerformed按鈕事件中使用單獨的線程,以便您的應用程序UI不會凍結。

+0

不,如果代碼需要一段時間才能完成(這將暗示需要'SwingWorker'),而不是使用SwingUtilities,而是使用SwingUtilities.invokeLater()將事件線程上的代碼排隊。 )'如果你在程序啓動時調用它並*關閉事件線程*。 –

+1

你是對的,在重讀他的答案後,我編輯了那段 –

1

Just Call JButton.doClick()它應該觸發與JButton關聯的ActionEvent。