[英]Programmatically Generating Actionevent in Java
我正在制作一個應用程序。 在java中,我有一個Button,我已經添加了一個actionlistener。 它生成的ActionEvent(按鈕)執行一些代碼。 現在我希望這段代碼能夠在應用程序運行時運行。 開始而不按下按鈕。 我的意思是,我想生成Actionevent(不按下按鈕),以便ActionPerformed包含的代碼段作為app執行。 開始。 之后,只要按下按鈕,它就可以運行。
只需使用構造函數,就可以像創建任何其他Java對象一樣創建ActionEvent。 然后你可以使用Component.processEvent(..)將它們直接發送到組件
但是,在這種情況下,我認為你最好將你的代碼變成一個單獨的函數,它被稱為:
這樣你就不會將表示邏輯與代碼所做的業務邏輯混淆在一起....
是的,它可以完成,但它確實沒有意義,因為你的目標不是按下按鈕或調用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.