GUI- wie cancel ich einen Timer?

lubi27X

Aktives Mitglied
Hätte mal eine Frage. Heute haben wir im Unterricht das Thema GUI begonnen und unsere erste Aufgabe bestand darin, ein Fenster zu basteln, wo vier kleiner Rechtecke zu sehen sind, die sich alle 250 ms um 5 Pixel schräg auseinander bewegen. Das die sich bewegen, jabe ich soweit hinbekommen. Doch wie bekomme ich es hin, dass der Timer stoppt, sobald eines der vier Rechtecke den Rand berührt.
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JFrame{
    
    private JPanel linksoben = new JPanel();
    private JPanel linksunten = new JPanel();
    private JPanel rechtsoben = new JPanel();
    private JPanel rechtsunten = new JPanel();
    
    
//    private static TimerTask();
    TimerTask moveAway = new TimerTask() {

        @Override
        public void run() {
            linksoben.setLocation(linksoben.getX() - 10, linksoben.getY() - 10);
            linksunten.setLocation(linksunten.getX() - 10, linksunten.getY() + 10);
            rechtsoben.setLocation(rechtsoben.getX() + 10, rechtsoben.getY() - 10);
            rechtsunten.setLocation(rechtsunten.getX() + 10, rechtsunten.getY() + 10);
            
        }
    };
    
    public MyFrame() {
        super("Aufgabe 25");
        this.setSize(550,600);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
        
        setLayout(null);
        
        
        //left top
        linksoben.setSize(50,50);
        linksoben.setLocation(200, 140);
        linksoben.setBackground(Color.RED);
        this.add(linksoben);
        //left bottom
        linksunten.setSize(50,50);
        linksunten.setLocation(200, 200);
        linksunten.setBackground(Color.BLACK);
        this.add(linksunten);
        //right top
        rechtsoben.setSize(50,50);
        rechtsoben.setLocation(270, 140);
        rechtsoben.setBackground(Color.YELLOW);
        this.add(rechtsoben);
        //right bottom
        rechtsunten.setSize(50,50);
        rechtsunten.setLocation(270,200);
        rechtsunten.setBackground(Color.GREEN);
        this.add(rechtsunten);
        
        
    }
    public void startTask() {
        Timer timer = new Timer();

        // bindet TimerTask moveAway an timer. 0 ist Verzögerung bis erste Ausführung,
        // 250 ist das Intervall in ms zwischen den Wiederholungen.
        timer.scheduleAtFixedRate(this.moveAway, 0, 250);
        timer.cancel();
        
    }
    
    public static void main(String[] args) {

        MyFrame fenster = new MyFrame();
        
        fenster.startTask();
        
    }
}

Meine Idee wäre es, in Zeile 70 sagen:
if (linksoben.getX() == 0)
{
timer.cancel();
}

Leider funktioniert das nicht.

Die Zeile 69 habe ich nur gemacht, um die Rechtecke erstmal nicht zu bewegen.
 
K

kneitzel

Gast
Hier ist der erste Schritt erst einmal, dass Du sauber formulierst:
a) Was soll das Verhalten genau sein?
Sobald ein Rechteck den Rand berührt, sollen alle Rechtecke aufhören, sich zu bewegen? Oder soll nur das Rechteck stoppen?

b) Uns immer sauber sagst, was funktioniert hat und was nicht funktioniert hat. Ein "Leider funktioniert das nicht" besagt nicht wirklich viel aus und wir dürfen dann raten, was passiert ist?

Typische Problematiken sind: Du prüfst auf eine exakte Grenze - die wird aber nicht erreicht sondern überschritten. (Dürfte aber nicht der Fall sein bei dir, da x 200 ist und immer um 10 reduziert wird ...)

Das Problem dürfte aber sein, dass du es nach eigenen Angaben in Zeile 70 eingebaut hast. Du bist der Timer und Du sollst von hier 100m in eine Richtung laufen. Ich rufe "los" und prüfe dann direkt, ob du 100m gelaufen bist .. bist Du natürlich nicht, denn Du musst mein "los" ja erst noch verarbeiten und losrennen ...
Also ist das die falsche Stelle. Du läufst in dem Du Schritt für Schritt voran gehst / läufst. nach jedem Schritt solltest Du also prüfen: Bin ich 100m gelaufen? Wenn ja: Dann bist Du fertig und kannst anhalten.

Hat das Beispiel es etwas verdeutlicht? Also nach der Bewegung prüfen, ob die Zielposition erreicht wurde.
 

lubi27X

Aktives Mitglied
Vorab erstmal zu meiner Formulierung. Du hast natürlich Recht. Es ist von mir schlecht formuliert.
Wenn das Rechteck oben links den Rand erreicht, sollen alle anderen Rechtecke sich nicht mehr weiter bewegen.

Dein Beispiel ist mir leider nicht ganz deutlich.....
 
K

kneitzel

Gast
Also in Kürze:
Java:
        @Override
        public void run() {
            linksoben.setLocation(linksoben.getX() - 10, linksoben.getY() - 10);
            linksunten.setLocation(linksunten.getX() - 10, linksunten.getY() + 10);
            rechtsoben.setLocation(rechtsoben.getX() + 10, rechtsoben.getY() - 10);
            rechtsunten.setLocation(rechtsunten.getX() + 10, rechtsunten.getY() + 10);
            // XXXXX
        }
Das ist im übertragenen Sinne das laufen -hier musst du prüfen, ob das Ziel erreicht wurde ...

Java:
        timer.scheduleAtFixedRate(this.moveAway, 0, 250);
        // XXXXXX
Da hast Du das Startsignal gegeben. Das ist also wie beim Wettlauf der Schiedsrichter mit der Kanone ... Direkt nach dem Startschuss ist doch noch kein Ziel erreicht.... das kommt doch erst mit der Zeit ...


Also: Bei der regelmäßigen Aktion willst Du prüfen, ob Du am Ziel bist.... nicht direkt nach dem start!
 

123neu

Bekanntes Mitglied
Ich hab hier mal aufgeräumt...

Java:
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JFrame {
    private static final long serialVersionUID = 1L;

    private JPanel linksoben = new JPanel();
    private JPanel linksunten = new JPanel();
    private JPanel rechtsoben = new JPanel();
    private JPanel rechtsunten = new JPanel();

    private boolean isInside(JPanel p) {
        Rectangle rect1 = new Rectangle(this.getContentPane().getLocation(), this.getContentPane().getSize());
        Rectangle rect2 = new Rectangle(p.getLocation(), p.getSize());
        return rect1.contains(rect2);
    }

    private TimerTask moveAway = new TimerTask() {
        public volatile AtomicBoolean isShowing = new AtomicBoolean(true);

        @Override
        public void run() {
            if (!isShowing.get()) {
                return;
            }
            int x = 10;
            linksoben.setLocation(linksoben.getX() - x, linksoben.getY() - x);
            linksunten.setLocation(linksunten.getX() - x, linksunten.getY() + x);
            rechtsoben.setLocation(rechtsoben.getX() + x, rechtsoben.getY() - x);
            rechtsunten.setLocation(rechtsunten.getX() + x, rechtsunten.getY() + x);
            if (!(isInside(linksoben) && isInside(linksunten) && isInside(rechtsoben) && isInside(rechtsunten))) {
                isShowing.set(false);
                stopTask();
            }
        }
    };
    private Timer timer = new Timer();

    public MyFrame() {
        super("Aufgabe 25");

        setLayout(null);

        // left top
        linksoben.setSize(50, 50);
        linksoben.setLocation(200, 140);
        linksoben.setBackground(Color.RED);
        this.add(linksoben);

        // left bottom
        linksunten.setSize(50, 50);
        linksunten.setLocation(200, 200);
        linksunten.setBackground(Color.BLACK);
        this.add(linksunten);

        // right top
        rechtsoben.setSize(50, 50);
        rechtsoben.setLocation(270, 140);
        rechtsoben.setBackground(Color.YELLOW);
        this.add(rechtsoben);

        // right bottom
        rechtsunten.setSize(50, 50);
        rechtsunten.setLocation(270, 200);
        rechtsunten.setBackground(Color.GREEN);
        this.add(rechtsunten);

        this.setSize(550, 600);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.setVisible(true);

        // optional
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                stopTask();
            }
        });
    }

    public void startTask() {
        timer.scheduleAtFixedRate(this.moveAway, 0, 250);
    }

    public void stopTask() {
        timer.cancel();
    }

    public static void main(String[] args) {
        MyFrame fenster = new MyFrame();

        fenster.startTask();
    }
}

Das volatile bei isShowing ist optional.
 

lubi27X

Aktives Mitglied
Fehler gefunden.. Ich musste in meiner run() Methode lediglich auf den timer zugreifen können, um diesen zu canceln.
Java:
    //inside class TimerTask
    TimerTask moveAway = new TimerTask() {

        @Override
        public void run() {
            linksoben.setLocation(linksoben.getX() - 10, linksoben.getY() - 10);
            linksunten.setLocation(linksunten.getX() - 10, linksunten.getY() + 10);
            rechtsoben.setLocation(rechtsoben.getX() + 10, rechtsoben.getY() - 10);
            rechtsunten.setLocation(rechtsunten.getX() + 10, rechtsunten.getY() + 10);
            
            if (linksoben.getX() <= 0)
            {
                timer.cancel();
            }
        }
    };
 

123neu

Bekanntes Mitglied
Das solltet ihr aber alles schon gehabt haben:

Java:
import java.awt.Color;
import java.awt.Rectangle;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JFrame {
    private static final long serialVersionUID = 1L;

    private JPanel linksoben = new JPanel();
    private JPanel linksunten = new JPanel();
    private JPanel rechtsoben = new JPanel();
    private JPanel rechtsunten = new JPanel();

    private TimerTask moveAway = new TimerTask() {
        public boolean isShowing = true;

        @Override
        public void run() {
            if (!isShowing) {
                return;
            }
            int x = 10;
            linksoben.setLocation(linksoben.getX() - x, linksoben.getY() - x);
            linksunten.setLocation(linksunten.getX() - x, linksunten.getY() + x);
            rechtsoben.setLocation(rechtsoben.getX() + x, rechtsoben.getY() - x);
            rechtsunten.setLocation(rechtsunten.getX() + x, rechtsunten.getY() + x);
            if (!(isInside(linksoben) && isInside(linksunten) && isInside(rechtsoben) && isInside(rechtsunten))) {
                isShowing = false;
                stopTask();
            }
        }
    };
    private Timer timer = new Timer();

    public MyFrame() {
        super("Aufgabe 25");

        setLayout(null);

        // left top
        linksoben.setSize(50, 50);
        linksoben.setLocation(200, 140);
        linksoben.setBackground(Color.RED);
        this.add(linksoben);

        // left bottom
        linksunten.setSize(50, 50);
        linksunten.setLocation(200, 200);
        linksunten.setBackground(Color.BLACK);
        this.add(linksunten);

        // right top
        rechtsoben.setSize(50, 50);
        rechtsoben.setLocation(270, 140);
        rechtsoben.setBackground(Color.YELLOW);
        this.add(rechtsoben);

        // right bottom
        rechtsunten.setSize(50, 50);
        rechtsunten.setLocation(270, 200);
        rechtsunten.setBackground(Color.GREEN);
        this.add(rechtsunten);

        this.setSize(550, 600);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.setVisible(true);
    }

    public void startTask() {
        timer.scheduleAtFixedRate(this.moveAway, 0, 250);
    }

    public void stopTask() {
        timer.cancel();
    }

    private boolean isInside(JPanel p) {
        Rectangle rect1 = new Rectangle(this.getContentPane().getLocation(), this.getContentPane().getSize());
        Rectangle rect2 = new Rectangle(p.getLocation(), p.getSize());
        return rect1.contains(rect2);
    }

    public static void main(String[] args) {
        MyFrame fenster = new MyFrame();

        fenster.startTask();
    }
}

long serialVersionUID = 1L; kannst du erst einmal ignorieren, das füge ich nur ein, damit Eclipse mich nicht anmeckert (hat etwas mit dem extends JFrame zu tun).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Threads SwingWorker läuft trotz cancel weiter Java Basics - Anfänger-Themen 22
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
M Enter bei OK_CANCEL_OPTION auf dem Cancel Button deaktivieren? Java Basics - Anfänger-Themen 5
B Cancel Funktion beim FileChooser Java Basics - Anfänger-Themen 5
C filechooser : exception bei cancel Java Basics - Anfänger-Themen 7
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
P Gibt es einen anderen Weg um "{}" in IntelliJ zu schreiben? Java Basics - Anfänger-Themen 5
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
F Hat es noch einen Sinn, alte Versionen zu lernen Java Basics - Anfänger-Themen 45
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
N Kann man einen Iterator nur einmal verwenden Java Basics - Anfänger-Themen 5
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
berserkerdq2 Brauche ich while != -1, wenn ich immer einen BufferedReader verwende? Java Basics - Anfänger-Themen 8
berserkerdq2 Habe ein Spiel entwickelt, dass immer in der 4 Runde einen cast-Fehler erhält Java Basics - Anfänger-Themen 3
N Gibt es hierfür einen Shortcut Java Basics - Anfänger-Themen 5
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
K Wie verneine ich einen Regex? Java Basics - Anfänger-Themen 2
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
D Einen boolischen Wert aus einer Methode in einer anderen Klasse aufrufen? Java Basics - Anfänger-Themen 11
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
Poppigescorn Mithilfe einer Arrayliste einen Notenspiegel ausgeben Java Basics - Anfänger-Themen 12
J Eintrag Combobox über einen String auswählen Java Basics - Anfänger-Themen 3
S Aus verschachtelter ArrayList auf einen Wert zugreifen Java Basics - Anfänger-Themen 4
LetsSebi Methode, die einen arry von objekten speichert in einer datei Java Basics - Anfänger-Themen 6
Devin Wo kann man einen Java Lehrplan finden? Java Basics - Anfänger-Themen 5
J Ist es möglich einen int Array wirklich leer zu initialisieren oder zu füllen? Java Basics - Anfänger-Themen 21
P Welche Zeile in Tadople gibt einen compiler error? Java Basics - Anfänger-Themen 5
S First Time Mave: Wie ergänze ich einen Source-Folder? Java Basics - Anfänger-Themen 10
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
P Methode die eigentlich einen Scanner benötigt mit toString() Java Basics - Anfänger-Themen 5
S Erste Schritte Button einen Wert zuweisen & diesen ausgeben Java Basics - Anfänger-Themen 2
M Auf einen Array innerhalb eines Objekts zugreifen Java Basics - Anfänger-Themen 5
V_Fynn03 Erste Schritte Einen Wert in ein TextField einfügen aus einer anderen Klasse Java Basics - Anfänger-Themen 3
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
F Hilfe für einen Anfänger! Java Basics - Anfänger-Themen 4
O Ziehen im Array um einen Schritt in eine einzige beliebige Richtung Java Basics - Anfänger-Themen 5
N Wie kann ich einen String wieder zusammensetzen und ausgeben lassen? Java Basics - Anfänger-Themen 9
T Fehlermeldung beim Versuch, einen String einzulesen Java Basics - Anfänger-Themen 4
J Wie kann ich z.B. einem int-Wert einen String-Wert zuweisen? Java Basics - Anfänger-Themen 2
steven789hjk543 Kann man mit Java und Eclipse einen Virus programmieren? Java Basics - Anfänger-Themen 13
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
T Einen Stern malen Java Basics - Anfänger-Themen 32
T Einen Stern malen Java Basics - Anfänger-Themen 2
L Files verschieben in einen Ordner Java Basics - Anfänger-Themen 87
A Mit JComboBox Ergebnis einen Integer aus einer anderen Klasse aufrufen. Java Basics - Anfänger-Themen 2
J Mit for Schleife einen String Rückwärts befüllen Java Basics - Anfänger-Themen 9
J Einen Buttonklick in Label anzeigen Java Basics - Anfänger-Themen 6
S Gibt es einen guten kostenlosen Online-kurs Java Basics - Anfänger-Themen 2
W Wie programmiere ich einen Potenzrechner? Java Basics - Anfänger-Themen 5
B ArrayList besitzt einen Wert zu wenig Java Basics - Anfänger-Themen 16
B Prüfen, ob es schon einen Termin gibt in einem Zeitraum Java Basics - Anfänger-Themen 5
B Wie instanzisiert man einen Cursor richtig? Java Basics - Anfänger-Themen 3
S Interface (WindowBuilder) Panels in einen Frame einfügen Java Basics - Anfänger-Themen 10
J Aufruf einer Methode über einen String Java Basics - Anfänger-Themen 11
C Wie erstellt man einen Timer/Delay? Java Basics - Anfänger-Themen 1
C Wie kann ich einen User Input mit einer If-Anweisung verbinden? Java Basics - Anfänger-Themen 5
J Guten tag, Ich hoffe ihr habt einen schönen Sonntag und könnt mir helfen Java Basics - Anfänger-Themen 2
D Methoden 2 TextWatcher auf einen EditText Java Basics - Anfänger-Themen 4
I Datentypen input.nextCharAt(0) wirft einen Fehler Java Basics - Anfänger-Themen 3
C In einer Methode einen Array zurückgeben Java Basics - Anfänger-Themen 2
S Bestehendes Java Programm, einen festen Wert ändern Java Basics - Anfänger-Themen 17
F Variablen If else: Einer Variable einen Wert hinzufügen oder so? Java Basics - Anfänger-Themen 6
R Übergeben eines Array Strings an einen Spinner Java Basics - Anfänger-Themen 4
Bluedaishi Einen Betrag X auf X Tage verteilen Java Basics - Anfänger-Themen 14
D Einen Wert unter einen ActionListener weitergeben Java Basics - Anfänger-Themen 1
J In Java einen Ton erzeugen Java Basics - Anfänger-Themen 8
C Variablen von einem JFrame in einen anderen übertragen Java Basics - Anfänger-Themen 3
V Arrays die einen Termin speichen Java Basics - Anfänger-Themen 5
G Wie gebe ich einen Dateipfad in RandomAccessFile an? Java Basics - Anfänger-Themen 2
R Wie kann ich einen Objekt zu Instanzvariable speichern ? Java Basics - Anfänger-Themen 10
F In LinkedList einen Wert ersetzen oder neu einfügen Java Basics - Anfänger-Themen 7
S Das Anführungszeichen(") Zeichen in einen String setzen Java Basics - Anfänger-Themen 1
P Einen String mittig zeichnen? Java Basics - Anfänger-Themen 1
J Erste Schritte Wie kann ich einen String in eine If einbauen :)? Java Basics - Anfänger-Themen 12
G Wie kann ich einem StringBuilder einen int Wert formatiert hinzufügen? Java Basics - Anfänger-Themen 8
P Einen Ordner mit Dateien hochladen [FTP] Java Basics - Anfänger-Themen 2
OlafHD Einen String an eine Klasse übergeben Java Basics - Anfänger-Themen 2
OlafHD Gibt es einen Laufbalken? Java Basics - Anfänger-Themen 2
Silvascus Inhalt eines externen Textdokuments an einen String übergeben Java Basics - Anfänger-Themen 2
B OOP Über einen AVL-Baum iterieren (NullPointer) Java Basics - Anfänger-Themen 5
G Erste Schritte Wie kann ich einen zurückgegebenen Wert ausgeben Java Basics - Anfänger-Themen 4
W Wie kann man diesen Code in einen Code umwandeln, der folgendes können sollte? Java Basics - Anfänger-Themen 1
J App auf einen Webserver laden Java Basics - Anfänger-Themen 14
E Was ergibt trim() auf einen leeren String Java Basics - Anfänger-Themen 3
B Schleife über einen Container Java Basics - Anfänger-Themen 7
X Quelltext einen Tic Tac Toe Spiels erklären Java Basics - Anfänger-Themen 4
M Panel erstellen, welches ein Control erhält. Ausgabe soll über einen Stream erfolgen. Java Basics - Anfänger-Themen 0
D Klassen Gesucht: Einfache Beispiel-Klasse für einen Datentyp Java Basics - Anfänger-Themen 7
B Wer kennt einen Link für vollständiges, leichtverständliches "Game of Life"? Java Basics - Anfänger-Themen 1
A Hat jemand einen ratschlag, wie java beim replaceALL eine geschweifte klammer erkennt ? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben