質問

別のクラス(GUI)のインスタンスを作成するクラス(シミュレーション)があります。クラスGUI内には、アクションリスナーが添付されたボタン(開始)があります。

シミュレーションでタイマーを開始するにはこのactionlistenerが必要ですが、その方法がわかりません。

クラスシミュレーションのコード:

public class Simulation{

private static JFrame frame;
private static GUI control;
public static Integer xcontrol = 100, ycontrol = 100;

public Timer timer;
public int steps;

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

}

public Simulation() {

frame = new JFrame("Action Listener Test");
frame.setLayout(new BorderLayout(1,0));

control = new GUI (xcontrol, ycontrol);
frame.getContentPane().add(control , BorderLayout.CENTER);

frame.setResizable(false);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}


public void StartTimer() {
    timer.start();
    System.out.println("It worked!");   
}

クラスGUIのコード:

        panel1.add(button1a);

            button1a.addActionListener(new ActionListener() {
                public void actionPerformed (ActionEvent event) {
                    Simulation.StartTimer();
                    }
                } );

Eclipseが教えてくれるエラーは、「Simulation.timer.start();" :

シミュレーション型から非静的メソッドStartTimer()への静的参照を作成できません。

ただし、メソッドStartTimer()はタイマーを壊すように見えるため、静的にすることはできません...

ご協力いただければ幸いです。

役に立ちましたか?

解決

this GUI コンストラクターの引数として渡します。

一般に、このような循環参照は避けるのが最善です。 GUI Simulator の両方が互いに依存します。このソリューションの本質は、GUIをドメイン固有の興味深い動作から分離することです。

(BTW:定数以外には静的変数を使用しないことを強くお勧めします。非プライベートインスタンス変数も避けます。ただし、 JFrame を拡張しないことのポイント!)

マルチスレッドを防ぐために追加する必要がある恐ろしい定型文がいくつかあります。

public static void main(final String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
                Simulation sim = new Simulation();
    }});
}

他のヒント

私がすることは、GUIクラスにgetButton()メソッドを介してボタンを公開し、GUIオブジェクトを作成した後、Simulationクラスが独自のActionListenerをボタンに追加できることです。 control.getButton()。addActionListener(new ActionListener()...など。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top