Animation nach Event

Pr0m3theus

Mitglied
Liebe Community,

ich möchte sehr gerne nach einem Tastendruck in einem JPanel eine kurze Animation ablaufen lassen (z.B. Punkt bewegt sich in eine Richtung).
Sowohl das KeyEvent als auch die Animation (über die Methode paintCompomnent(Graphic g) einer extendet Klasse Panel) funktionieren, sofern sie im Programmablauf getrennt voneinander ablaufen. Die Animation "auf Knopfdruck" will aber einfach nicht funktionieren. Ich kann den Fehler in Code und/ oder Logik nicht ausmachen.
Ich übergebe Euch am Besten einfach mal den Code für beide Klassen (eine dritte Klasse startet das Programm mit der main-Methode):

Code:
package Animation2;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class GrafikM extends JPanel{
 
    private int a;
    private int b;
 
    public GrafikM(){
        a = 300;
        b = 300;
    }
 
    public void erhoeheA(){
        a++;
    }
 
    public void erhoeheB(){
        b--;
    }
 
    public int gibAnfangA(){
        return a;
    }
 
    public void setA(int aP){
     
        a = aP;
     
    }
 
    public int gibAnfangB(){
        return b;
    }
 
    public void setB(int bP){
     
        b = bP;
     
    }
 
 
 

    public void paintComponent(Graphics g){
        ImageIcon i = new ImageIcon("/Users/user/Documents/workspace/KopfBisFuss/src/Animation/mStand.png");
        i.paintIcon(this, g, a, b);}
 
 
}


Code:
package Animation2;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

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

import klassen2.MeinZeichenPanel;

public class Hauptklasse implements ActionListener, Runnable{

    private int x;
    private int y;
    JFrame frame;
Container cp;
GrafikM zeichenPanel;

    public Hauptklasse(){
        x = 70;
        y = 70;
     
        los();
        effekt();
 
    }
 
 
 
 
    public void los(){
     
        frame = new JFrame();
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
     
 
        cp = frame.getContentPane();
     
     
     
        frame.setSize(640, 480);
     
        frame.setVisible(true);
             
 
        }
     
 
 
 
 
 
    public void effekt(){
     
        JButton button1 = new JButton("Spring!");
        button1.addActionListener(this);
     
        zeichenPanel = new GrafikM();
        cp.add(zeichenPanel);
        cp.add(BorderLayout.SOUTH, button1);
        frame.setVisible(true);
    int anfangA = zeichenPanel.gibAnfangA();
    int anfangB = zeichenPanel.gibAnfangB();
        for(int i = 0; i<80; i++){
         
         
            zeichenPanel.erhoeheB();
            zeichenPanel.repaint();
         
         
            try{
                Thread.sleep(5);
            } catch (Exception e){}
         
         
    }
        zeichenPanel.setA(anfangA);
        zeichenPanel.setB(anfangB);
        zeichenPanel.repaint();
        }
 
 
    public void actionPerformed(ActionEvent l){
     
 
        effekt();
        System.out.println(l.getActionCommand());
    }
 
    public void run(){
        effekt();
    }
 

 
 
 
 
}
 
Zuletzt bearbeitet von einem Moderator:

Enceladus271

Bekanntes Mitglied
Du darfst niemals bei der Behandlung von Events (also z.B. in der Methode actionPerformed) längere Berechnungen oder Thread.sleep oder ähnliches ausführen, da während dieser gesamten Zeit der Event-Dispatch-Thread blockiert ist, und somit die GUI nicht neu gezeichnet werden kann.

Als einfache Lösung kannst du in der actionPerformed einen neuen Thread starten, der die Animation durchführt.

Hinweise:
1. Wieso erzeugst du bei jeder Animation die Buttons neu?
2. Sieh dir mal die Klasse javax.swing.Timer an
 

Robat

Top Contributor
Hinweise:
1. Wieso erzeugst du bei jeder Animation die Buttons neu?

Sehe ich genau so..
Die Methode Effekt ist eigentlich ziemlich nutzlos. Dein Button kannst du im Konstruktor deklarieren / initialisieren, und der Rest deiner Effekt Methode gehört eigentlich nur in dein actionPerformed.

Mach dir am besten eine neue Methode doSmth() in der du einen neuen Thread startest, der dann alle deine Sachen ausführt die jetzt noch in Effekt() drinne stehen :)

PS: Wird dein Bild überhaupt geladen? mMn läd man Icons doch mit:
Java:
ImageIcon i = new ImageIcon(this.getClass().getResources("mein/super/cooler/path/bla.png");

Gruß Robert
 

Pr0m3theus

Mitglied
Vielen Dank für die Antworten!
Das Gesetz ist mir klar geworden; wie aber soll ich in der actionPerformed einen neuen Thread starten, wenn doch gilt:
Du darfst niemals bei der Behandlung von Events (also z.B. in der Methode actionPerformed) längere Berechnungen oder Thread.sleep oder ähnliches ausführen, da während dieser gesamten Zeit der Event-Dispatch-Thread blockiert ist.

Widerspricht sich das nicht? Bei mir klappt es wenn ich den Thread in die actionPerformed setze leider immer noch nicht :-(

Wäre über eine finale Hilfe dankbar!

Wird dein Bild überhaupt geladen?
Ja, kein Problem!
 

Harry Kane

Top Contributor
Widerspricht sich das nicht
Nein. Ganz im Gegenteil.
Gerade weil du in der actionPerformed() kein Thread.sleep() oder keine zeitaufwändigen Aktionen machen sollst (weil die actionPerformed() im EDT läuft und diesen blockiert, solange sie nicht beendet ist), musst du einen neuen Thread erstellen, der dann die Aktion ausführt (oder schlafen gelegt werden kann, aber das ist dann etwas sinnfrei).
Bei mir klappt es wenn ich den Thread in die actionPerformed setze leider immer noch nicht :-(
*seufz* "Geht nicht" ist keine Fehlermeldung. Poste mal ein KSKB.
 

Pr0m3theus

Mitglied
Hallo,

komme nun nicht ganz weiter. Die Frage scheint banal, aber wie kann ich in meinem Programmcode noch einen neuen Thread starten? Die Aktion, die ich haben möchte und in der .sleep vorkommen soll, muss doch eben nach dem Klick/ Tastendruck kommen ... :(
 

Robat

Top Contributor
Hey,

einen Thread startest du i.d.R. mit:

Java:
Thread t = new Thread();
t.start();

Kenne deinen jetzigen Code natürlich nicht,
den könntest du mal posten, wenn dir der Hinweis nicht reicht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
Developer_X Nach Animation Button adden AWT, Swing, JavaFX & SWT 3
N Animation nach einem bestimmten Ereignis starten lassen? AWT, Swing, JavaFX & SWT 4
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Ruckelfreie Animation AWT, Swing, JavaFX & SWT 20
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
javampir 2D-Grafik Effizienz bei animation AWT, Swing, JavaFX & SWT 0
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
P Ansatz für 2D Animation gesucht AWT, Swing, JavaFX & SWT 2
Thallius HHübsche Kopier Animation? AWT, Swing, JavaFX & SWT 5
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
E Animation läuft nicht mehr flüssig AWT, Swing, JavaFX & SWT 8
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
J GIF Animation AWT, Swing, JavaFX & SWT 2
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
K 3D-Grafik Animation AWT, Swing, JavaFX & SWT 4
U Gif Animation mit JLabel AWT, Swing, JavaFX & SWT 3
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
R Polygon-Animation mit Darstellungsfehlern AWT, Swing, JavaFX & SWT 5
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
S SWT Rudimentäre Bild Animation AWT, Swing, JavaFX & SWT 3
C Animation auf einem JPanel AWT, Swing, JavaFX & SWT 3
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
H "Animation" AWT, Swing, JavaFX & SWT 2
S Animation korrekt darstellen AWT, Swing, JavaFX & SWT 8
Developer_X Swing JPanel-THE ANIMATION AWT, Swing, JavaFX & SWT 3
T JFrame und Scale-Animation AWT, Swing, JavaFX & SWT 8
M Animation berechnen AWT, Swing, JavaFX & SWT 4
M Animation auf JPanel per Knopfdruck AWT, Swing, JavaFX & SWT 12
P Problem bei Animation AWT, Swing, JavaFX & SWT 2
K Animation auf GUI AWT, Swing, JavaFX & SWT 3
R ruckelfreie animation AWT, Swing, JavaFX & SWT 8
T Animation will nicht trotz Thread. AWT, Swing, JavaFX & SWT 14
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
S Animation geht nicht AWT, Swing, JavaFX & SWT 3
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
rudi.schraml Animation von Robotern auf FactoryFloor - repaint()? AWT, Swing, JavaFX & SWT 7
J Animation - Runnable AWT, Swing, JavaFX & SWT 3
O Animation in einem JPanel AWT, Swing, JavaFX & SWT 2
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
A Problem mit Animation AWT, Swing, JavaFX & SWT 4
M Animation mit Keylistener AWT, Swing, JavaFX & SWT 2
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
H JavaFX Fenstergröße nach maximieren erkennen AWT, Swing, JavaFX & SWT 6
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
VPChief Nach abspielen von Sound reagiert das Program nichtmehr AWT, Swing, JavaFX & SWT 9
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JavaFX Zustand der CheckMenuItems behalten nach Programmneustart AWT, Swing, JavaFX & SWT 7
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
stroggi Swing Suche nach Kurveneditor (UI-Element) AWT, Swing, JavaFX & SWT 1
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben