Frage

Ich habe eine Klasse (Simulation), die eine Instanz einer anderen Klasse erstellt (GUI). Innerhalb der Klasse GUI gibt es eine Schaltfläche (Start), die eine Action daran befestigt hat.

Ich brauche diese Action einen Timer in der Simulation zu starten, aber ich kann nicht herausfinden, wie es geht.

-Code in der Klasse Simulation:

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!");   
}

-Code in der Klasse GUI:

        panel1.add(button1a);

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

Der Fehler von Eclipse sagt mir, es ist, ist, dass für „Simulation.timer.start ();“ :

Es kann keine statische Verweis auf die nicht-statische Methode Starttimer () vom Typ Simulation machen.

Allerdings ist die Methode Starttimer () kann nicht statisch sein, da dies den Timer zu brechen scheint ...

Jede Hilfe wäre sehr geschätzt.

War es hilfreich?

Lösung

Pass this als Argument für den Konstruktor GUI.

Im Allgemeinen ist es am besten, solche zyklischen Referenzen zu vermeiden. Sowohl die GUI und Simulator aufeinander angewiesen. Das Wesen der Lösung ist, die GUI von dem interessanten domänenspezifischen Verhalten zu trennen.

(BTW:..! Ich mag vermeiden, stark mit statischen Variablen für etwas anderes als Konstanten auch nicht-private Instanzvariablen vermeiden, aber Punkt für nicht JFrame erstreckt)

Es gibt einige scheußliche vorformulierten, die Sie hinzufügen sollten Multithreading verhindern.

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

Andere Tipps

Was ich tun würde, ist Ihre GUI-Klasse auf den Button über einen getButton () -Methode aussetzen, dann nach dem GUI-Objekt erstellen, Ihre Simulation Klasse kann seine eigene Action auf die Schaltfläche hinzufügen, zum Beispiel control.getButton (). addActionListener (neue Action () ... etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top