Simpler Timer zum warten

derSoerrn

Aktives Mitglied
Hallo zusammen,

ich versage gerade daran mein Java-Programm für 100 Millisekunden zu pausieren. Ich habe nämlich ein JPanel, was bei Knopfdruck ausfährt. Allerdings möchte ich nicht, dass es mit einem Mal da ist sonder fände es schöner, wenn es geschmeidig in meinem Fenster heruntergleitet. Ich hab' bereits versucht mit
Code:
Thread.sleep(100);
zu arbeiten aber das hat aus irgendeinem Grund nicht funktioniert. Vielleicht "verträgt" sich dies ja nicht mit javax.swing. Aber ich habe keine Ahnung..

Hier der Code mit dem Thread-Versuch:

Java:
private void raus(){
            int hoeheAnfang = 10;
            Ausfahren.this.setSize(breiteNachher, hoheNachher + knopfRaus.getHeight());
            c.setLocation(0, knopfRaus.getHeight());
            c.setSize(breiteNachher, hoeheAnfang);
            Ausfahren.this.add(c);
            while(hoeheAnfang <= hoheNachher){
                c.setSize(breiteNachher, hoeheAnfang);
                try{
                    Thread.sleep(100);
                }
                catch(Exception e){
                    System.out.println("warten fehlgeschlagen");
                }
                hoeheAnfang = hoeheAnfang + 70;
            }
            c.setSize(breiteNachher, hoheNachher);
        }

P.S. das "c." ist in diesem Fall ein JPanel.

Ich hoffe Ihr könnt mir helfen ;)
 
Zuletzt bearbeitet:

derSoerrn

Aktives Mitglied
Wenn ich einen der beiden Timer benutzen würde, dann sieht das meiner Meinung nach nicht so schön aus :p Gibt es nicht eine Methode die einfach nur sagt, dass das Programm 100 ms wartet?
 

VfL_Freak

Top Contributor

derSoerrn

Aktives Mitglied
Java:
try{
                    Thread.sleep(100);
                }
                catch(Exception e){
                    System.out.println("warten fehlgeschlagen");
                }

Der wirft mir dann den catch part entgegen.
 

Michael...

Top Contributor
Wenn ich einen der beiden Timer benutzen würde, dann sieht das meiner Meinung nach nicht so schön aus
Was sieht nicht so schön aus bzw. wie sieht es aus und wie sollte es aussehen?
Wie sieht Dein Code dazu aus? Evtl. liegt ja hier die Ursache,

Möglichkeiten sind Timer, Timer oder Threads - aber nicht so wie im ersten Post den EDT einfach schlafen legen...
 

derSoerrn

Aktives Mitglied
Vielleicht liegt es auch daran, dass ich das nicht so ganz verstehe was André Uhres meinte.
Oder besser noch mit einem Swing Timer. Alle Callbacks laufen dann auf dem Event Dispatch Thread (EDT). Das ist nützlich für Swing Anwendungen, weil alle GUI Operationen auf dem EDT laufen müssen.
 

derSoerrn

Aktives Mitglied
[WR]java.lang.IllegalMonitorStateException[/WR]
die bekomme ich. Sie endet mit einem Fehler in.

[WR]java.awt.EventDispatchThread.run(EventDispatchThread.java:97)[/WR]
 

derSoerrn

Aktives Mitglied
Java:
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.Timer;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.Font;
/**
 * @author 
 * @version 
 */
public class Ausfahren extends JPanel{
    // Bezugsobjekte
    JPictureButton knopfRaus, knopfRein;
    Linie linie;
    JLabel text;
    // Attribute
    private int x, y, breite, breiteNachher, hoheNachher;
    private String aufschrift;
    private long warte;
    private Component c;
    // Konstruktor
    public Ausfahren(int x, int y, int breite, long zeit, String aufschrift, Component c){
        u = new Uhr();
        this.setLayout(null);
        this.x = x;
        this.y = y;
        if(breite != 0){
            this.breite = breite;
        }
        this.hoheNachher = c.getHeight();
        this.breiteNachher = c.getWidth()-x;
        this.c = c;
        this.warte = zeit;

        knopfRaus = new JPictureButton(0, 0, "Bilder\\Ausklappen1.png", "Bilder\\Ausklappen2.png", "Bilder\\Ausklappen3.png");
        knopfRaus.addActionListener(new ActionHandler());
        knopfRein = new JPictureButton(0, 0, "Bilder\\Einklappen1.png", "Bilder\\Einklappen2.png", "Bilder\\Einklappen3.png");
        knopfRein.addActionListener(new ActionHandler());

        text = new JLabel();
        text.setLayout(null);

        linie = new Linie();
        linie.setBounds((knopfRaus.getWidth()), 0, (breite - knopfRaus.getWidth()-x), 20);
        linie.setBackground(Color.GREEN);

        if(aufschrift != null){
            text.setLayout(null);
            text.setBounds(knopfRaus.getWidth()+20, 0, (breite - knopfRaus.getWidth()-x), 20);
            text.setFont(new Font("Arial", Font.BOLD, 20));
            text.setText(aufschrift);
        }

        this.setBounds(x, y, breite, knopfRaus.getHeight());
        this.add(linie);
        this.add(knopfRaus);
        this.setComponentZOrder(text, 0);
        this.add(c);
        this.remove(c);
    }

    // Dienste
    /**
     * Setzt einen Text an die gewünschte Position neben den Knopf zum ausfahren des neuen Componenten
     */
    public void setzeSchrift(int x, String aufschrift, Font f, Color c){
        text.setForeground(c);
        text.setFont(f);
        text.setBounds(knopfRaus.getWidth()+20, 0, (breite - knopfRaus.getWidth()-x), 10);
        text.setText(aufschrift);
        text.setHorizontalAlignment(x);
        this.add(text);

    }

    /**
     * "Repaintet alle Objekte in dieser Klasse
     */
    public void repaintPanels(){
        c.repaint();
        linie.repaint();
        this.repaint();
    }

    private class ActionHandler implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource().equals(knopfRaus)){
                Ausfahren.this.remove(knopfRaus);
                Ausfahren.this.add(knopfRein);
                ausklappen();
                Ausfahren.this.repaint();
            }else if(e.getSource().equals(knopfRein)){
                Ausfahren.this.remove(knopfRein);
                Ausfahren.this.add(knopfRaus);
                einklappen();
                Ausfahren.this.repaint();
            }
        }

        private void ausklappen(){
            int hoeheAnfang = 10;
            Ausfahren.this.setSize(breiteNachher, hoheNachher + knopfRaus.getHeight());
            c.setLocation(0,knopfRaus.getHeight());
            c.setSize(breiteNachher, hoeheAnfang);
            Ausfahren.this.add(c);
            while(hoeheAnfang <= hoheNachher){
                c.setSize(breiteNachher, hoeheAnfang);
                try{
                    this.wait(100);
                }
                catch(Exception e){
                    e.printStackTrace();
                }
                hoeheAnfang = hoeheAnfang + 70;
            }
            c.setSize(breiteNachher, hoheNachher);
        }

        private void einklappen(){
            int hoeheEnde = hoheNachher;
            while(hoeheEnde >= 0){
                c.setSize(breiteNachher, hoeheEnde);

                try{
                    Thread.sleep(warte);
                }
                catch(Exception e){
                    System.out.println("warten fehlgeschlagen");
                }
                hoeheEnde = hoeheEnde - 70;
            }
            c.setSize(0, 0);
            Ausfahren.this.setSize(breiteNachher, knopfRaus.getHeight());
            Ausfahren.this.remove(c);
        }
    }
    private class Linie extends JLabel{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            if(breite != 0){
                this.setForeground(Color.BLACK);
                g.drawLine(0, (this.getHeight()/2), this.getWidth()-x, (this.getHeight()/2));
            }
        }
    }
}

Die Namen der Methoden, Attribute etc. sind vielleicht nicht so gut gewählt :p
 

Michael...

Top Contributor
In dem Code ist aber nichts von einem Timer oder Thread zu sehen. Ich dachte Du hättest es bereits mit einem Timer implementiert? Oder worauf bezog sich: "dann sieht das ... nicht so schön aus"
 

André Uhres

Top Contributor
Vielleicht liegt es auch daran, dass ich das nicht so ganz verstehe was André Uhres meinte.

Der EDT ist sehr wichtig, weil er alle Events der Swing Komponenten weiterleitet und die Malmethoden aufruft. Es ist der Thread, auf dem wir mit Swing zusammenarbeiten. Wenn wir zum Beispiel eine Taste in einem JTextField drücken, leitet der EDT dieses Event weiter an den KeyListener der Komponente. Die Komponente aktualisiert dann ihr Model und schickt einen Malantrag fort. Der EDT verarbeitet diesen Malantrag und sagt wiederum der Komponente, dass es Zeit ist, sich neu zu malen. Kurz gesagt: in Swing geschieht alles auf dem EDT!

Übrigens, wenn wir eine langwierige Operation auf dem EDT ausführen, wie das Lesen einer Datei, blockieren wir die ganze Benutzeroberfläche: keine Events werden weitergeleitet und keine Bildschirmaktualisierung wird durchgeführt solange die zeitaufwendige Operation andauert. Aus Benutzersicht scheint dann die Anwendung zu hängen oder zumindest sehr langsam zu sein.

In Java gibt es den util.Timer und den swing.Timer. Der swing.Timer bietet eine API, die an eine Swing Umgebung besser angepasst ist als der util.Timer. Er macht es äußerst einfach, periodische Aktionen durchzuführen und stellt sicher, dass alles auf dem EDT durchgeführt wird. Ein Timer, der die Benutzeroberfläche aktualisiert, ist daher gewöhnlich ein swing.Timer. Ein Timer dagegen, der Hintergrundoperationen durchführt, ist gewöhnlich ein util.Timer.

sleep() ist nützlich, wenn wir nur einen einzigen Aufwachbefehl brauchen. Wenn wir diesen jedoch immer wieder benötigen, ist ein Timer besser geeignet: wir brauchen uns dann nicht mehr um den Aufwachbefehl zu kümmern und werden bei der eigentlichen Sache, die zu tun ist, nicht durch einen sleep() blockiert. Die Benutzeroberfläche wird dadurch insgesamt leistungsfähiger.

Gruß,
André
 

derSoerrn

Aktives Mitglied
Java:
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.Timer;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.Font;
/**
 * @author 
 * @version 
 */
public class Ausfahren extends JPanel{
    // Bezugsobjekte
    JPictureButton knopfRaus, knopfRein;
    Linie linie;
    JLabel text;
    Timer t;
    // Attribute
    private int x, y, breite, breiteNachher, hoheNachher;
    private String aufschrift;
    private long warte;
    private Component c;
    // Konstruktor
    public Ausfahren(int x, int y, int breite, long zeit, String aufschrift, Component c){
        this.setLayout(null);
        this.x = x;
        this.y = y;
        if(breite != 0){
            this.breite = breite;
        }
        this.hoheNachher = c.getHeight();
        this.breiteNachher = c.getWidth()-x;
        this.c = c;
        this.warte = zeit;

        knopfRaus = new JPictureButton(0, 0, "Bilder\\Ausklappen1.png", "Bilder\\Ausklappen2.png", "Bilder\\Ausklappen3.png");
        knopfRaus.addActionListener(new ActionHandler());
        knopfRein = new JPictureButton(0, 0, "Bilder\\Einklappen1.png", "Bilder\\Einklappen2.png", "Bilder\\Einklappen3.png");
        knopfRein.addActionListener(new ActionHandler());

        text = new JLabel();
        text.setLayout(null);

        linie = new Linie();
        linie.setBounds((knopfRaus.getWidth()), 0, (breite - knopfRaus.getWidth()-x), 20);
        linie.setBackground(Color.GREEN);

        if(aufschrift != null){
            text.setLayout(null);
            text.setBounds(knopfRaus.getWidth()+20, 0, (breite - knopfRaus.getWidth()-x), 20);
            text.setFont(new Font("Arial", Font.BOLD, 20));
            text.setText(aufschrift);
        }
        this.setBounds(x, y, breite, knopfRaus.getHeight());
        this.add(linie);
        this.add(knopfRaus);
        this.setComponentZOrder(text, 0);
        this.add(c);
        this.remove(c);
    }

    // Dienste
    /**
     * Setzt einen Text an die gewünschte Position neben den Knopf zum ausfahren des neuen Componenten
     */
    public void setzeSchrift(int x, String aufschrift, Font f, Color c){
        text.setForeground(c);
        text.setFont(f);
        text.setBounds(knopfRaus.getWidth()+20, 0, (breite - knopfRaus.getWidth()-x), 10);
        text.setText(aufschrift);
        text.setHorizontalAlignment(x);
        this.add(text);

    }

    /**
     * "Repaintet alle Objekte in dieser Klasse
     */
    public void repaintPanels(){
        c.repaint();
        linie.repaint();
        this.repaint();
    }

    private class ActionHandler implements ActionListener{
        private int hoeheAnfang = 10;
        private int hoeheEnde = hoheNachher;
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource().equals(knopfRaus)){
                Ausfahren.this.remove(knopfRaus);
                Ausfahren.this.add(knopfRein);
                ausklappen();
                Ausfahren.this.repaint();
            }else if(e.getSource().equals(knopfRein)){
                Ausfahren.this.remove(knopfRein);
                Ausfahren.this.add(knopfRaus);
                einklappen();
                Ausfahren.this.repaint();
            }
        }

        private void ausklappen(){
            Ausfahren.this.setSize(breiteNachher, hoheNachher + knopfRaus.getHeight());
            c.setLocation(0,knopfRaus.getHeight());
            c.setSize(breiteNachher, hoeheAnfang);
            Ausfahren.this.add(c);
            while(hoeheAnfang <= hoheNachher){
                t = new Timer(100, new ActionListener()
                    {
                        @Override
                        public void actionPerformed(ActionEvent e){
                            c.setSize(breiteNachher, hoeheAnfang);
                            hoeheAnfang = hoeheAnfang + 70;
                        }
                    }
                );
            }
            c.setSize(breiteNachher, hoheNachher);
        }

        private void einklappen(){
            while(hoeheEnde >= 0){
                t = new Timer(100, new ActionListener()
                    {
                        @Override
                        public void actionPerformed(ActionEvent e){
                            c.setSize(breiteNachher, hoeheEnde);
                            hoeheEnde = hoeheEnde - 70;
                        }
                    }
                );
            }
            c.setSize(0, 0);
            Ausfahren.this.setSize(breiteNachher, knopfRaus.getHeight());
            Ausfahren.this.remove(c);
        }
    }

    private class Linie extends JLabel{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            if(breite != 0){
                this.setForeground(Color.BLACK);
                g.drawLine(0, (this.getHeight()/2), this.getWidth()-x, (this.getHeight()/2));
            }
        }
    }
}

... sorry Jungs hab euch aus Versehen das alte geschickt ^^ Tut mir leid! Aber ich glaube ich habe es eh falsch implementiert :(

Danke André das hat mir so einiges verdeutlicht :)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Simpler Eventlistener für Tastaturtaste bauen? Allgemeine Java-Themen 13
Horst79 Ein ganz simpler filebrowser als applet Allgemeine Java-Themen 2
J YAML + Java: Simpler Code funktioniert nur unter Windows Allgemeine Java-Themen 2
H ganz simpler chat Allgemeine Java-Themen 8
thE_29 Simpler FTP Client Allgemeine Java-Themen 3
T Simpler Webserver Allgemeine Java-Themen 11
J Simpler Thread lässt sich NIE über interrupt() unterbrechen Allgemeine Java-Themen 8
W Timer terminiert nicht Allgemeine Java-Themen 5
W Timer Konzept-Frage Allgemeine Java-Themen 16
Z Timer Allgemeine Java-Themen 5
H Timer funktioniert nicht? Allgemeine Java-Themen 3
Tacofan Kurzer Timer Allgemeine Java-Themen 22
B Threads Timer wird immer schneller Allgemeine Java-Themen 6
H Consumer (Java8 Lambda) an Timer übergeben Allgemeine Java-Themen 2
wolfgang63 Best Practice Taktgeber oder Timer mit variablem Intervall Allgemeine Java-Themen 1
I Timer Allgemeine Java-Themen 1
X Timer Allgemeine Java-Themen 3
C Timer? Allgemeine Java-Themen 8
U Timer - Timertask endet nicht Allgemeine Java-Themen 4
X timer.schedule - Allgemeine Java-Themen 7
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
G Threads Timer wird unterbrochen Allgemeine Java-Themen 20
P Java Timer Allgemeine Java-Themen 3
K Timer Thread Allgemeine Java-Themen 8
E Wie Timer anbringen mit Designer in Netbeans Allgemeine Java-Themen 5
M Ampelsteuerung über Timer in Java realisieren Allgemeine Java-Themen 3
O Timer pausieren Allgemeine Java-Themen 5
M Timer von nicht existiertem Objekt stopen Allgemeine Java-Themen 5
B util.Timer zu langsam? Allgemeine Java-Themen 3
P Java Timer Allgemeine Java-Themen 2
S Timer in Applet? Allgemeine Java-Themen 11
G Swing Timer führt Methode nicht aus Allgemeine Java-Themen 2
V Frage zu util.Timer (-> TimerTask) Allgemeine Java-Themen 2
P Swing Eine Sekunde warten (Timer) Allgemeine Java-Themen 7
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
T Timer oder Alternative? Allgemeine Java-Themen 3
Z Timer -> Thread jeden Tag ausführen Allgemeine Java-Themen 5
D Probleme mit einem Timer Allgemeine Java-Themen 6
E Timer - gleichen Task mehrfach planen Allgemeine Java-Themen 2
D Timer oder Thread, das ist hier die Frage Allgemeine Java-Themen 3
A TimerTask - Task stoppen - timer.cancel() funktioniert nicht Allgemeine Java-Themen 8
S Problem mit einem Timer (Aktualisierung etc.) Allgemeine Java-Themen 2
B Timer übergabe Allgemeine Java-Themen 3
G Timer abbrechen und neu starten Allgemeine Java-Themen 3
G timer mit buttondruck abbrechen Allgemeine Java-Themen 7
T Timer oder ähnliches? Allgemeine Java-Themen 3
O Timer und TimerTask: Programm terminiert nicht! Allgemeine Java-Themen 3
O Thread als Timer Interrupt Allgemeine Java-Themen 2
C Timer.scheduleAtFixedRate(). Allgemeine Java-Themen 5
H gibts in Java sowas wie in Visual Basic den Timer? Allgemeine Java-Themen 5
B 24 Uhr Timer Task Allgemeine Java-Themen 5
G Timer nur 64 mal pro Sekunde? Allgemeine Java-Themen 18
S Frage zu jTDS, JAVA allgemein und Timer Allgemeine Java-Themen 6
L Problem mit Timer Allgemeine Java-Themen 7
J Timer-Objekt / Task-Zustand ermitteln Allgemeine Java-Themen 5
J Warten bis cmd Prozess fertig ist Allgemeine Java-Themen 2
M Warten vor OnClickListener Allgemeine Java-Themen 2
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
M Warten bis Variabel nicht null ist Allgemeine Java-Themen 18
chuxXo Warten auf BasicPlayer - JavaZOOM SoundAPI Allgemeine Java-Themen 8
J Java Auf anderes Programm warten Allgemeine Java-Themen 9
W Threads Threads warten lassen Allgemeine Java-Themen 5
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
das-mo Warten auf Event Allgemeine Java-Themen 7
L Im Thread auf Eingaben warten Allgemeine Java-Themen 3
frankred Threads Auf eine Gruppe von Threads warten Allgemeine Java-Themen 11
S Warten, bis ein Impuls von außen kommt. Allgemeine Java-Themen 2
A Warten auf shellscript Allgemeine Java-Themen 3
K Warten bis Datei geändert Allgemeine Java-Themen 2
R Programm soll warten bis eine Passwort eingabe gemacht wurde. Allgemeine Java-Themen 6
KrokoDiehl Desktop.open() und warten? Allgemeine Java-Themen 3
Guybrush Threepwood Warten, bis keine Taste gedrückt Allgemeine Java-Themen 11
H auf Methode warten Allgemeine Java-Themen 2
F thread warten lassen Allgemeine Java-Themen 2
N "Bitte warten"-Meldung Allgemeine Java-Themen 6
kodela Warten mit Java Allgemeine Java-Themen 5
L Warten bei mehreren Threads, bis Ende erreicht ist Allgemeine Java-Themen 2
S Threads eines Pools aufeinander warten lassen Allgemeine Java-Themen 11
J Main-Thread soll auf alleKinder Threads warten Allgemeine Java-Themen 5
MQue auf gestarteten Process warten Allgemeine Java-Themen 7
M Auf Einträge im Buffer warten Allgemeine Java-Themen 7
M In der GUI / im Model auf Webrequest warten? Allgemeine Java-Themen 4
G Auf den Start eines Threads warten? Allgemeine Java-Themen 4
M Auf Thread warten Allgemeine Java-Themen 5
G Warten? Allgemeine Java-Themen 3
R Warten auf Beendigung eines externen Prozesses Allgemeine Java-Themen 4
B Programm soll auf die Eingabe vom Mouselistener warten. Allgemeine Java-Themen 19
C Java Parameter zum starten ohne auf Programmende zu warten Allgemeine Java-Themen 4
M Methode soll warten, bis Button gedrückt Allgemeine Java-Themen 2
P Warten auf ein Ereignis Allgemeine Java-Themen 7
R Thread beenden und warten, bis er fertig ist Allgemeine Java-Themen 4
K Warten auf die Eingabe aus Fenster.... Allgemeine Java-Themen 2
O Warten bis alle gestarteten Threads beendet sind? Allgemeine Java-Themen 6
Q Methode soll auf schließen eines Frames warten Allgemeine Java-Themen 4
S methode stoppen / auf ein event warten Allgemeine Java-Themen 5
J x Sekunden warten, dann Kommando ausführen Allgemeine Java-Themen 8
B Thread soll auf Event warten, dann Daten an Klasse senden Allgemeine Java-Themen 2
R Thread soll auf MouseClick warten Allgemeine Java-Themen 2
W Warten bis gestartetes Programm beendet wird Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben