Javaの:そのクラスからオブジェクトの上に別のクラス内の関数を呼び出すためにActionListenerを使用します
-
20-09-2019 - |
質問
基本的に私は何をしたいの方法別のクラスで実行され、別のオブジェクトに作用を開始するために、スタートボタンを取得されます。
リスナーのための私のコード:
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
}
私は、これはあまりにも難しいことはできませんが、私は作品を欠けている感覚を得る。
解決
匿名クラスで物事を参照するための一つの方法は、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);
}
}
他のヒント
私はあなたのような同じ問題を持っていたし、これは私がそれを解決する方法です。
あなたは、オブジェクトの最終(最終CastleCrashシム=新しいCastleCrashを();)作ることができるのいずれかが、私はそれを行うにはしたくなかった、またはあなたが他のクラスのメソッドを実行するためのsetterメソッドのようなものを作ることができます。
リスナークラスのための私のコード:
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
}
この希望が便利です、幸運! :)
マクドウェルは、すでにイベントリスナー(または一般に匿名内部クラス)から変数にアクセスする方法についての良い例と実質的に答えます。スイング中のイベント・リスナーのより一般的なSunのリソースは、しかし、があります>それは正規のある、それらを書くときに、すべての警告の良い概要を考慮に入れています。
は、どういうわけか、あなたのactionListenerから呼び出すことが可能な、あなたのCastleCrashオブジェクトへの参照が必要です。
あなたは、おそらくのJFrameをサブクラス化したい、またはあなたのJButtonを含むされているものは、それはあなたのあなたの主な方法と、あなたの匿名の内部クラスのActionListenerから参照することができCastleCrash特性の両方を有するようにます。
- しかし注意してください、あなたは(アクションリスナーが呼び出されます)GUIイベントスレッド内から長時間実行方法がどうなるかを呼んでいるように見えます。これは一般的に悪い考えです、あなたが応答しなくなるために、あなたのGUIを小文字になります。