1

私は、Java で simpleGUI 用の小さなコードを書きました。

package guidemo1;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class GuiDemo1 implements ActionListener{
 JButton button;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        GuiDemo1 gui=new GuiDemo1();
        gui.go();
    }

    public void go()
    {
        JFrame frame=new JFrame();
        button=new JButton();
        frame.getContentPane().add(button);
        button.addActionListener(this);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setVisible(true);

    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
        button.setText("I've been clicked");
    }
}

私は JAVA の初心者です。このプログラムに関していくつか質問があります。

actionPerformed メソッドが呼び出しなしで実行される方法を説明できる人はいますか?

ここでは、フレーム オブジェクトを go() メソッドに対してローカルに定義し、別のメソッドである actionPerformed でボタンを使用しています。これはどのように可能ですか?ボタンはフレームに埋め込まれていませんか?

ありがとう..

4

5 に答える 5

3

あなたのクラスは を実装ActionListenerしているので、メソッドを定義する必要がありますactionPerformedbutton.addActionListener(this)ボタン押下のリスナーとして現在のオブジェクトを登録する呼び出しも行います。

ボタン押下イベントがトリガーされると、リスナーとして登録したオブジェクトを含むすべてのリスナーに通知されます。

于 2013-02-21T10:43:26.923 に答える
3

イベント駆動型環境へようこそ。

この環境では、何かが起こるまで待機し、明確に定義されたインターフェース構造を介してレポートを返す「リスナー」を登録します。

基本的には、ボタンで発生する可能性のあるアクション イベントの利害関係者として自分自身を登録したということです。ActionListenerインターフェースを実装することでこれを行いました。actionPerformedこれにより、アクションが実行されたときにボタンが将来のある時点でメソッドにコールバックできるようになります。

これは、オブザーバー パターンとして一般的に知られています。

イベント リスナの記述が役に立つかもしれません。

于 2013-02-21T10:46:27.823 に答える
1

2 番目の質問については、Java は参照言語です。すべてのオブジェクトはヒープ上に存在し、誰かがオブジェクトへの参照を保持している限り生き続けます。

Swing では、ケースはもう少し複雑です。Swing ライブラリは、すべての GUI 要素 (JFrame や JButton など) への参照を保持しているため、それらへの参照を保持しなくなったとしても、それらは削除されません。

最初の質問については、メイン スレッドが何をするかを見てください。メイン スレッドは新しいオブジェクト GuiDemo1 を作成し、JFrame を作成する go() メソッドを呼び出し、そのフレームを表示します。GUI でイベントが発生するのをバックグラウンドで待機する特別な Swing スレッド、イベント ディスパッチ スレッドがあります。フレームを表示すると EDT が開始され、フレームがレンダリングされてスリープ状態になります。メインメソッドですべての作業を完了したメインスレッドは、その後 DIES になります。

これで、JFrame が表示され、イベント ディスパッチ スレッドがスリープ状態になりました。EDT は現在、JFrame とのユーザー インタラクション (イベント) を待機しています。Swing はイベント駆動型です。フレームを操作するたびに、Swing はフレームのイベントを作成し、EDT を起動してイベントを処理します。たとえば、ボタンをクリックすると、EDT が起動し、ボタンの「クリック」をアニメーション化し、すべてのアクション リスナーを呼び出します。それはあなたのメソッド actionPerformed が呼び出されたときです。

于 2013-02-21T10:50:32.243 に答える
1

actionPerformed メソッドが呼び出しなしで実行される方法を説明できる人はいますか?

GUI フレームワーク Swing は、バックグラウンドでアクション処理コードを実行します。ボタンが押されるか、ユーザーが他の方法で GUI と対話するたびに、Swing は多くのListenerインターフェースの 1 つを介してアプリケーションに通知します。これらのイベントを受け取るには、クラスが適切なListenerインターフェースを実装し、関心のある各コンポーネントのリスナーとして登録する必要があります。

クラスはActionListenerインターフェイスを実装し、addActionListenerそれ自体をボタンに登録するための呼び出しを行います。ボタンがクリックされると、Swing はメソッドActionListenerを呼び出して、登録されているすべてのに通知しようとしactionPerformedます。それが「魔法」が起こる方法です。

ここではフレーム オブジェクトを go() メソッドにローカルに定義し、別のメソッドである actionPerformed でボタンを使用しています。どのようにそれが可能ですか?ボタンはフレームに埋め込まれていませんか?

フレームのコンテンツ ペインへaddのボタン - これにより、コードではなくレイアウトのフレーム内にボタンが配置されます。メソッドの外に置くことによってインスタンス変数として宣言するため、そのクラスの任意の (非) メソッドから引き続きアクセスできます。buttonJButton button;static

于 2013-02-21T10:56:08.633 に答える
0
  • ActionListener を実装する

  • インターフェイスに ActionListener を追加する

  • actionPerformed メソッドをクラスに追加します

  • タイマーを設定してクラスで開始する

それはそれをするでしょう

于 2013-03-30T19:28:12.803 に答える