Fließende Bewegung von Graphics

raGe666

Mitglied
Hi,

ich hab noch eine Frage zu dem ganzen Graphicszeug. Und zwar möchte ich auf Knopfdruck eine Ellipse verschieben, ohne dass diese sofort dorthin spring, sondern eben dorthin "fließt". Dabei denke ich an die Animation von Pacman, der von Zelle zu Zelle "läuft" und eben nicht auf einmal in einer Zelle verschwindet und in der nächsten Zelle wieder auftaucht.
Das hab ich im Moment so umgesetzt, dass bei Tastendruck ein Timer mit 10ms delay gestartet wird und er so die Position x um 1 vergrößert, bis sie insgesamt um zB 50 Pixel verschoben wurde. Jetzt kommt mir das sehr umständlich und auch ziemlich hässlich vor. Wird das denn "normalerweise" auch so gemacht, oder gibts da vielleicht Sachen in JavaFX? Oder nimmt man da eigtl. ein animiertes .gif?

Hier mal der Code vom Listener:
[JAVA=89]class MyListener implements ActionListener {
Test caller;
int i;
int dir;

javax.swing.Timer timer;

public MyListener(Test o) {
this.caller = o;
i = 0;
timer = new javax.swing.Timer(10, this);
}


public void actionPerformed(ActionEvent evt) {
Object obj = evt.getSource();

if (obj.equals(caller.button1)) {
if (caller.pane.y >= 10) {
i = 0;
dir = 0;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button2)) {
if (caller.pane.x <= 290) {
i = 0;
dir = 1;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button3)) {
if (caller.pane.y <= 290) {
i = 0;
dir = 2;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(caller.button4)) {
if (caller.pane.x >= 10) {
i = 0;
dir = 3;
timer.start();
toggleButtons(false);
}
} else if (obj.equals(timer)) {
if (i == 50) {
timer.stop();
toggleButtons(true);
} else {
if (dir == 0) {
caller.pane.y--;
} else if (dir == 1) {
caller.pane.x++;
} else if (dir == 2) {
caller.pane.y++;
} else if (dir == 3) {
caller.pane.x--;
}
i++;
}
}
caller.label.setText(caller.pane.x + ", " + caller.pane.y);
caller.frame.repaint();
}

public void toggleButtons(boolean b) {
caller.button1.setEnabled(b);
caller.button2.setEnabled(b);
caller.button3.setEnabled(b);
caller.button4.setEnabled(b);
}
}[/code]
 

Marco13

Top Contributor
Das Verfahren an sich ist nicht falsch. (Die Alternative, ohne Timer, ist in http://www.java-forum.org/entwuerfe/113007-kein-swing-tutorial-2.html#post808287 beschrieben, aber beachte auch die nachfolgende Diskussion: Ein Timer ist vielleicht nicht verkehrt).

Das häßliche kommt dort IMHO eher daher, dass alle ActionListener zusammengewurstet sind. Vielleicht kann man das mit einer anonymen inneren Klasse schöner machen
Java:
timer = new javax.swing.Timer(10, new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent evt) {
        if (i == 50) {
            timer.stop();
            toggleButtons(true);
        } else {    
            pane.x += dx;
            pane.y += dy;
        }
    }
});
Ähnlich für die Buttons.
 

raGe666

Mitglied
Das fand ich immer unschön, dass dann im Folder mehr Dateien erzeugt werden. Aber gut, wenn ichs in ne jar packe, sieht mans ja eh nicht mehr..
Hab gerade in JavaFX reingeschaut, vermutlich ist das, was ich mir weiter aneignen sollte, wenn ich mehr solche Animationen machen will

Danke fürs Feedback
 

Marco13

Top Contributor
Effektiv sind beide. Falls 'effizient' gemeint war: Das mag in mancher hinsicht stimmen, aber das sollte man doch etwas differenzierter betrachten...
 

Marco13

Top Contributor
Ja, man könnte da sehr lange (und SEHR differenziert) drüber reden. Einmal ist ein neuer Thread eben ein neuer Thread - ggf. kann da etwas echt parallel ablaufen, schließlich haben wir alle QuadCores. Dann verwendet der Swing-Timer intern einen "Scheduling"-Mechanismus, der recht aufwändig ist (um rauszufinden, wer wann als nächstes benachrichtigt werden muss). Er ist nicht sooo aufwändig dass es unbedingt die Performance merklich runterziehen würde, aber - bei einem eigenen Thread fällt es eben weg. Dafür muss man sich bei letzterem Gedanken um die synchronisation machen - und das kann wiederum SEHR kompliziert sein. Insgesamt kann man sagen, dass so ein SwingTimer für vieles SO viel einfacher zu verwenden ist, dass man nur Threads verwenden sollte, wenn es wirklich auf viel Performance, Parallelität (!) und genaue Kontrolle über die Abläufe ankommt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Bewegung funktioniert nicht AWT, Swing, JavaFX & SWT 3
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
J Bewegung rauf und ab AWT, Swing, JavaFX & SWT 5
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
F Swing Jump and Run Bewegung!? AWT, Swing, JavaFX & SWT 11
B bewegung mit Pfeiltasten? AWT, Swing, JavaFX & SWT 2
M 3D-Grafik Bewegung mit der Maus ohne Klicken AWT, Swing, JavaFX & SWT 10
S Problem mit JLabel (Bewegung in Schleife) AWT, Swing, JavaFX & SWT 7
W Kein MouseKlick-Event bei Bewegung AWT, Swing, JavaFX & SWT 2
G Cursor Bewegung tracken AWT, Swing, JavaFX & SWT 2
B kein MouseEvent bei zu schneller Bewegung der Maus AWT, Swing, JavaFX & SWT 7
N Graphics Objekte scalen mit Veränderung des Bildschirms AWT, Swing, JavaFX & SWT 19
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R AWT Graphics initialisieren AWT, Swing, JavaFX & SWT 15
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
B Graphics to Image AWT, Swing, JavaFX & SWT 3
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
V Netbeans: TabbedPane, ScrollPane und Graphics AWT, Swing, JavaFX & SWT 4
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
M Graphics.fillOval AWT, Swing, JavaFX & SWT 1
javampir Sauberes Faden mit awt Graphics AWT, Swing, JavaFX & SWT 6
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
C Zwei Ebenen in Graphics ? AWT, Swing, JavaFX & SWT 0
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
I JavaFX Graphics Performance AWT, Swing, JavaFX & SWT 2
vodkaz Graphics aufrufen AWT, Swing, JavaFX & SWT 4
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
M Graphics.drawImage von unten nach oben abbilden lassen AWT, Swing, JavaFX & SWT 6
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
M JFrame Graphics.drawString Problem AWT, Swing, JavaFX & SWT 11
I Rechteck eines Graphics eines JPanels in einem anderen JPanel anzeigen AWT, Swing, JavaFX & SWT 7
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
R Ankerpunkt bei Graphics AWT, Swing, JavaFX & SWT 3
T AWT Graphics G Kein Text erscheint warum? AWT, Swing, JavaFX & SWT 12
L Graphics.drawImage() - Output-Größe entspricht nicht Parametern AWT, Swing, JavaFX & SWT 10
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
P "Graphics" wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
L Graphics Objekt - aus anderer Klasse aufrufen / übergeben AWT, Swing, JavaFX & SWT 5
B Swing Zeilenumbruch in Graphics AWT, Swing, JavaFX & SWT 20
T Graphics zeichnet nicht AWT, Swing, JavaFX & SWT 2
T Applet graphics - zeichnen funktioniert nicht AWT, Swing, JavaFX & SWT 14
R Graphics-Object speichern AWT, Swing, JavaFX & SWT 4
S Zeichnen mit java.awt.Graphics AWT, Swing, JavaFX & SWT 6
D Graphics zeichnen AWT, Swing, JavaFX & SWT 6
M Graphics auf JFrame Koordinatensystem AWT, Swing, JavaFX & SWT 3
T Graphics Ersetzend Zeichnen AWT, Swing, JavaFX & SWT 6
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
D Erzeugen eines leeren Graphics-Objektes AWT, Swing, JavaFX & SWT 7
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
A AWT AWT Panelfenster mit Graphics kombinieren AWT, Swing, JavaFX & SWT 7
T Graphics Parameterübergabe AWT, Swing, JavaFX & SWT 3
K Graphics.drawImage() sehr schnell AWT, Swing, JavaFX & SWT 5
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
M Graphics.drawImage verlangsamt sich plötzlich AWT, Swing, JavaFX & SWT 15
S Swing AWT (graphics (g)) AWT, Swing, JavaFX & SWT 27
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
B Swing Tooltips auf Graphics AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Applet mit Graphics dynamisch vergrößern AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
E Problem bzw. Sinn von Graphics / Graphics Context AWT, Swing, JavaFX & SWT 21
S Weder ActionListener noch Graphics wollen so recht AWT, Swing, JavaFX & SWT 3
F Methode drawOval(int,int,int,int) von graphics AWT, Swing, JavaFX & SWT 4
G Graphics Objekte in AWT Container einfügen AWT, Swing, JavaFX & SWT 2
S Mit Graphics g ins Fenster zeichnen AWT, Swing, JavaFX & SWT 4
G Graphics - Raute AWT, Swing, JavaFX & SWT 3
G "pinseldicke" bei Graphics? AWT, Swing, JavaFX & SWT 2
G Graphics.drawImage() AWT, Swing, JavaFX & SWT 6
D Methode Graphics g klassenübergreifend nutzen. AWT, Swing, JavaFX & SWT 3
W java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/Dev AWT, Swing, JavaFX & SWT 1
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
T Transparenz bei Graphics AWT, Swing, JavaFX & SWT 9
L Graphics AWT, Swing, JavaFX & SWT 37
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
Y Problem mit der Referenz eines Graphics-Objekts AWT, Swing, JavaFX & SWT 5
O Graphics erstellt Componente scheinbar nicht richtig AWT, Swing, JavaFX & SWT 23
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
K Gutes Buch gesucht (Graphics Only) Kennt jemand eins? AWT, Swing, JavaFX & SWT 5
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
J Einmal gleichzeitig auf zwei Graphics malen? AWT, Swing, JavaFX & SWT 5
E Image, Graphics, verzögert zeichnen AWT, Swing, JavaFX & SWT 2
N Graphics Objekt "puffern" AWT, Swing, JavaFX & SWT 7
H neuzeichnen von graphics nach minimierung oder ähnlichem AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben