2011-07-23 14 views
3

私はアプリケーションを作っています。私はActionListenerを追加したボタンがあるjavaで。 it(ボタン)が生成するActionEventは、いくつかのコードを実行します。今度は、このコードをアプリが実行されるたびに実行します。ボタンを押すことなく開始します。私はActionPerformedが含んでいるコードがアプリケーションとして実行されるように(ボタンを押さずに)Actioneventを生成したいと思います。開始。その後、ボタンを押すたびに実行されることがあります。プログラムでJavaでアクションを生成する

答えて

2

はい、実行できますが、ボタンを押したりActionListenerのコードを呼び出すのではなく、ボタンを押してプログラムの開始時に共通の動作をすることが目的であるため、実際には意味をなさないアップ。これを実現する最善の方法は、ActionListenerのactionPerformedメソッドと起動時のクラスの両方によって呼び出されるメソッドを持つことです。

ここに簡単な例があります。次のコードでは、メソッドがボタンを無効にし、JPanelを緑色にし、2秒後にボタンを有効にしてJPanelの背景色をデフォルトにリセットするTimerを開始します。

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を作成することができます。この動作は、メインクラスのコンストラクタにとのJButtonのActionListenerののactionPerformedメソッドの両方で呼び出された原因となる方法。そして、あなたは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();  
} 

のようなもので始まり、実行するにはしばらく時間がかかりますactionPerformedボタンイベント内で別のスレッドを使用するようにして、アプリケーションUIがフリーズしないようにします。

+0

いいえ、Minkeraはコードが完了するまでに(SwingWorkerが必要であることを示唆しています)、SwingUtilitiesを使用するように宣言していませんでしたが、SwingUtilities.invokeLater(。あなたがプログラムの起動時にそれを呼び出すのであれば、イベントスレッド*から*オフ)。 –

+1

あなたは正しいです、彼の答えを再読した後、私はそのパラグラフを編集しました –

1

JButton.doClick() JButtonに関連付けられたActionEventを発生させる必要があります。

関連する問題