7

基本的に私がやりたいことは、別のクラスで実行され、別のオブジェクトに作用するメソッドを開始するための開始ボタンを取得することです。

リスナーの私のコード:

button1a.addActionListener(new ActionListener() {
    public void actionPerformed (ActionEvent event) {
        // Figure out how to make this work
        //sim.runCastleCrash(); 
    }
} );

他のクラスの私のコード:

public static void main(String[] args) {
    CastleCrash sim;
    sim = new CastleCrash();
}

public void runCastleCrash() {
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

これはそれほど難しいことではないと感じていますが、ピースが欠けています.

4

4 に答える 4

5

匿名クラスで物事を参照する1つの方法は、finalキーワードを使用することです。

  public static void main(String[] args) {
    final Object thingIWantToUse = "Hello";

    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println(thingIWantToUse);
      }
    });

    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

または、囲んでいるタイプのメンバー(変数またはメソッド)にアクセスすることもできます。

public class ActionListenerDemo2 {
  private final JFrame frame = new JFrame();
  private Object thingIWantToUse = "Hello";

  public ActionListenerDemo2() {
    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        thingIWantToUse = "Goodbye";
        System.out.println(thingIWantToUse);
      }
    });
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new ActionListenerDemo2().frame.setVisible(true);
  }
}
于 2009-08-28T13:45:09.580 に答える
3

私はあなたと同じ問題を抱えていましたが、これが私がそれを解決した方法です。

オブジェクトを final にすることもできます (final CastleCrash sim = new CastleCrash();) が、私はそうしたくありませんでした。または、他のクラスでメソッドを実行するセッター メソッドのようなものを作成することもできます。

リスナー クラスの私のコード:

button1a.addActionListener(new ActionListener()
{

    public void actionPerformed (ActionEvent event)
    {
    //How to make this work ?
    //Like this:
    runCC();
    }
});

public void runCC()
{
    CastleCrash sim = new CastleCrash();
    sim.runCastleCrash();
}

他のクラスの私のコード:

public void runCastleCrash()
{   
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

これが役に立てば幸いです、頑張ってください!:)

于 2012-02-14T06:22:03.300 に答える
1

McDowell は、イベント リスナー (または一般的な匿名の内部クラス) から変数にアクセスする方法について、適切な例を挙げて実際に既に回答しています。ただし、Swing のイベント リスナーに関するより一般的な Sun リソースがあります。これは標準的であり、それらを作成する際に考慮すべきすべての注意事項の概要を示しています。

于 2009-08-28T13:58:47.753 に答える
0

どういうわけか、actionListenerから呼び出すことができるCastleCrashオブジェクトへの参照が必要です。

おそらく、JFrame、またはJButtonを含むものをサブクラス化して、メインメソッドとCastleCrashプロパティの両方を持ち、匿名の内部クラスActionlistenerから参照できるようにする必要があります。

ただし、注意してください。GUIイベントスレッド(アクションリスナーが呼び出される場所)内から、長時間実行されるメソッドを呼び出しているように見えます。これは一般的に悪い考えです。GUIが応答しなくなる場合があります。

この問題を回避する方法については、 http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html、特にSwingWorkerクラスのビットを参照してください。

于 2009-08-28T13:41:58.943 に答える