2016-09-20 5 views
0

Ich habe nicht in Java für lange, einen Monat höchstens codieren, aber ich habe in mehreren anderen objektorientierten Sprachen codiert.Verwenden eines Swing-Timers in Java

Ich versuche, die Swing-Timer in java.swing.timer enthalten, und ich lese https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html zu versuchen und zu verstehen.

Ich verstehe, dass mit timer = new Timer(speed, this) Geschwindigkeit ist, wie oft der Timer ausgelöst wird, aber ich verstehe nicht, was this bedeutet. Außerdem weiß ich, dass public void actionPerformed(ActionEvent e) jedes Mal ausgeführt wird, wenn der Timer ausgelöst wird, aber gibt es eine Möglichkeit für mich, zwei Timer in derselben Klasse zu verwenden?

Jede Hilfe wird geschätzt, danke im Voraus.

Antwort

4

Der Konstruktor Sie Aufruf hat diese Signatur:

public Timer(int delay, ActionListener listener) 

Das bedeutet, dass in dem Beispiel this zu einer Instanz der ActionListener Schnittstelle bezieht.

In Ihrem Beispiel implementiert die Klasse, die den Timer-Code enthält, ActionListener. Dies dient lediglich dazu, ein prägnantes Beispiel zu geben.

Sie können jede Instanz eines ActionListener an Ihren Timer übergeben. Wenn Sie Java 8 verwenden, ist dies sehr einfach mit method references.

public class TheExample 
{ 
    public TheExample() 
    { 
    final Timer timerOne = new Timer(speedOne, this::timerOneMethod); 
    final Timer timerTwo = new Timer(speedTwo, this::timerTwoMethod); 
    } 

    private void timerOneMethod(ActionEvent e) 
    { 
    // do something exciting 
    } 

    private void timerTwoMethod(ActionEvent e) 
    { 
    // do something else exciting 
    } 
} 

Wenn Sie nicht 8 unter Verwendung von Java, das gleiche erreicht werden kann anonymous inner classes verwenden. Sie können eine example of this way here finden.

+0

Schönes Beispiel für Methodenreferenzen dort! +1 dafür! – GhostCat

+0

Bei 'this :: timerOne' ist ein Fehler aufgetreten. Der Fehler lautet "Syntaxfehler bei Token, lösche diese Token". Weißt du, wie das zu beheben ist? – SAT

+0

@SAT: Der obige Code ist gültig für Java 8 - verwenden Sie Java 8? (Überprüfen Sie auch, ob Ihre IDE für die Sprachebene auf Java 8 konfiguriert ist). –

2

Die javadoc für Timer sagt Ihnen, was das Konstruktor ist about - es dauert ein int und eine Instanz von Action.

Also, Ihre erste Frage in dem Beispiel-Code von Oracle zu beantworten, timer = new Timer(speed, this) geschieht innerhalb der init Methode dieses Applets, das das beispielhaften UI Dingen bildet. Also: Diese bezieht sich auf das "aktuelle" Objekt (siehe here für weitere Details), wobei das Applet-Objekt die ganze Methode "gehört".

Und das funktioniert nur, weil diese Beispielklasse TumleItem als TumbleItem extends JApplet implements ActionListener deklariert ist.

Für das Protokoll: zu verstehen, was das ist über absolut grundlegende Dinge. Wenn Sie nicht wissen, was dieser ungefähr ist, dann sollten Sie sich noch nicht mit der UI-Programmierung beschäftigen. Lernen Sie zu crawlen, bevor Sie versuchen, auszuführen.

Für Ihre zweite Frage:. Für jede Instanz eines Timer Sie verwenden mögen, benötigen Sie eine Action, die Sie in passieren können der Old-School-Weg, dies zu tun wäre anonyme innere Klassen zu verwenden, wie

timer = new Timer(someSpeed, new ActionListiner() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
     System.out.println("Whatever"); 
    } 
} 

Endlich: dass ein Beispiel von Oracle Applets verwendet, und einfach gesprochen: Applets sind tote Technologie. Bleib nicht zu lange auf ihnen hängen; Sie vermeiden es besser, Zeit damit zu verbringen.

Verwandte Themen