Grafik (Kreis) schneller bewegen?

Jack159

Bekanntes Mitglied
Hallo,

Ich habe einen Kreis auf einem JPanel gezeichnet. Diesen kann ich mit den Pfeiltasten steuern.
Das Problem ist aber, dass der Kreis sich zu langsam bewegt. Wenn ich die Anzahl der Pixel erhöhe, um die der Kreis bewegt werden soll, dann wirkt die Bewegung zu ruckelartig.
Gibts da sonst noch irgendeine Möglichkeit?


Hier mal das Programm (Falls es wen intressiert):

Java:
package A;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


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

public class StartPanel extends JPanel implements KeyListener {
	
	public int x = 200;
	public int y = 200;
	
	public StartPanel(JFrame frame1) {
		
		
		frame1.add(this);
		setFocusable(true);
		this.addKeyListener(this);
		
	}
	
	public void paintComponent(Graphics g) {
	     super.paintComponent(g);            
	     
	  
	     g.fillOval(x, y, 50, 50);
	     
	     
	   }


	public void keyPressed(KeyEvent e) {
		
		int code = e.getKeyCode();
		if(code==38) {
			y -= 20;
			repaint();
		System.out.println("Pfeiltaste OBEN wurde gedrückt");		
		} else if(code==40) {
			y += 20;
			repaint();
		System.out.println("Pfeiltaste UNTEN wurde gedrückt");
		} else if(code==39) {
			x += 20;
			repaint();
		System.out.println("Pfeiltaste RECHTS wurde gedrückt");
		} else if(code==37) {
			x -= 20;
			repaint();
		System.out.println("Pfeiltaste LINKS wurde gedrückt");
		}
		
	}

	
	public void keyReleased(KeyEvent e) {
	}

	
	public void keyTyped(KeyEvent e) {
	}

}

Java:
package A;

import javax.swing.JFrame;

public class StartFrame extends JFrame {
	
	
	
	public StartFrame(int x, int y, String titel) {
		
		this.setSize(x, y);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle(titel);
		this.setLocation(500, 200);
		
	}

}

Java:
package A;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Start {
	
	
	
	public static void main(String[] args) {
		
		StartFrame frame = new StartFrame(1000, 600, "Start");
		StartPanel panel = new StartPanel(frame);
		
		
	}

	
	
	

}
 

Marco13

Top Contributor
Im Moment hängt die "Geschwindigkeit", mit der sich der Kreis bewegt, von der Wiederholrate der Tastatur ab. (Das kann man irgendwo einstellen, im Bios oder OS..?!). Also vereinfacht gesagt: Es hängt davon ab, wie viele 'a's erscheinen, wenn man
aaaaaaaaaaaaaaaaaaaaaaaaaaaa
gedrückt hält.

Zusätzlich wirst du gesehen haben, dass nach dem drücken ein Schritt gemacht wird, und dann eine kurze Pause, bevor er anfängt, sich "schnell" zu bewegen.

Eine Methode, die in diesem Fall sinnvoller sein könnte, wäre sich ständig zu speichern, welche Tasten gerade gedrückt sind, und die Bewegung ständig (in einem eigenen Thread) abhängig von den gedrückten Tasten zu machen.

Ausfühlicher beschrieben ist das AFAIR auch im http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli-2d-spiele-tutorial.html (was du dir auch mal ansehen könntest).

Das hier ist nur zu Demozwecken schnell hingehackt - solltest du NICHT unverstanden und unvoreingenommen so übernehmen, nur zum anschauen:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


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

class StartPanel extends JPanel implements KeyListener {

    public int x = 200;
    public int y = 200;

    private int dx = 0;
    private int dy = 0;

    public StartPanel(JFrame frame1) {


        frame1.add(this);
        setFocusable(true);
        this.addKeyListener(this);


        Thread thread = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                while (true)
                {
                    x += dx;
                    y += dy;
                    repaint();
                    try
                    {
                        Thread.sleep(20);
                    }
                    catch (InterruptedException e)
                    {
                        Thread.currentThread().interrupt();
                        return;
                    }
                }
            }
        });
        thread.start();
    }

    public void paintComponent(Graphics g) {
         super.paintComponent(g);


         g.fillOval(x, y, 50, 50);


       }




    public void keyPressed(KeyEvent e) {

        int code = e.getKeyCode();
        if(code==KeyEvent.VK_UP) {
            dy = -20;
        System.out.println("Pfeiltaste OBEN wurde gedrückt");
        } else if(code==KeyEvent.VK_DOWN) {
            dy = 20;
        System.out.println("Pfeiltaste UNTEN wurde gedrückt");
        } else if(code==KeyEvent.VK_RIGHT) {
            dx = 20;
        System.out.println("Pfeiltaste RECHTS wurde gedrückt");
        } else if(code==KeyEvent.VK_LEFT) {
            dx = -20;
        System.out.println("Pfeiltaste LINKS wurde gedrückt");
        }

    }


    public void keyReleased(KeyEvent e) {
        dx = 0;
        dy = 0;
    }


    public void keyTyped(KeyEvent e) {
    }

}
class StartFrame extends JFrame {



    public StartFrame(int x, int y, String titel) {

        this.setSize(x, y);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle(titel);
        this.setLocation(500, 200);

    }

}

public class CircleMove {



    public static void main(String[] args) {

        StartFrame frame = new StartFrame(1000, 600, "Start");
        StartPanel panel = new StartPanel(frame);


    }
}
 

Jack159

Bekanntes Mitglied
Danke für das Tutorial, werd ich auf jeden Fall durchschauen.

Hab deinen Beispiel Code mal ausprobiert. Dort tritt aber das Problem auf "Je länger ich z.b. nach rechts steuere, desto schneller wird der Kreis". ???:L
 

Marco13

Top Contributor
Hm ... ???:L Sollte nicht sein, und kann ich auch nicht erklären (abgesehen von ein bißchen JIT, aber das sollte nichts machen...). Sicher, dass das nicht nur täuscht? Was passiert, wenn du die 20's durch 2's ersetzt?
@all: Kann irgendjemand das Problem nachvollziehen?
 

Jack159

Bekanntes Mitglied
In der Zwischenzeit vorhin hatte ich nochmal nach einer weiteren Lösung geschaut und bin auf diese Variante gestoßen:

Java GUI Lesson 11 | Moving a Graphic - YouTube

Dort wird ein "Timer" verwendet.
Hier nun mein veränderter Code mit der Timer Variante:

Java:
package A;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;


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

public class StartPanel extends JPanel implements KeyListener, ActionListener {
	
	
	Timer t = new Timer(5, this);
	
	public int x = 200;
	public int y = 200;
	public int dx = 0;
	public int dy = 0;
    boolean links = false;
    boolean rechts = false;
    boolean oben = false;
    boolean unten = false;
	
	public StartPanel(JFrame frame1) {
		
		
		frame1.add(this);
		setFocusable(true);
		addKeyListener(this);
		
		t.start();
		
		
		
	}
	
	
	public void paintComponent(Graphics g) {
	     super.paintComponent(g);            
	     Graphics2D g2 = (Graphics2D) g;
	     Ellipse2D circle = new Ellipse2D.Double(x, y, 40, 40);
	     g2.fill(circle);
	     
	    // g.fillOval(x, y, 50, 50);
	     
	     t.start();
	   }


	public void keyPressed(KeyEvent e) {
		
		int code = e.getKeyCode();
		
		if(code==KeyEvent.VK_UP) {
			oben = true;
			
		} else if(code==KeyEvent.VK_DOWN) {
			unten = true;
			System.out.println("UNTEN");
			
		} else if(code==KeyEvent.VK_RIGHT) {
			rechts = true;
			System.out.println("RECHTS");
			
		} else if(code==KeyEvent.VK_LEFT) {
			links = true;
			System.out.println("LINKS");
		}
		
	}

	
	public void keyReleased(KeyEvent e) {
		
		int code = e.getKeyCode();
		
		if(code==KeyEvent.VK_UP) {
			oben = false;
			
		} else if(code==KeyEvent.VK_DOWN) {
			unten = false;
			
			
		} else if(code==KeyEvent.VK_RIGHT) {
			rechts = false;
			
			
		} else if(code==KeyEvent.VK_LEFT) {
			links = false;
			
		}
		
		
	}

	
	public void keyTyped(KeyEvent e) {
	}


	@Override
	public void actionPerformed(ActionEvent e) {

		if(oben) {
            dy = -1;
            dx = 0;
            
        }
    
        if(unten) {
        	dy = 1;
        	dx = 0;
        }
        
        if (links) {
        	dy = 0;
        	dx = -1;
        }
        
        if (rechts) {
        	dy = 0;
        	dx = 1;
        }
        
   
        
        x +=dx;
        y +=dy;
        repaint();
        dx = 0;
        dy = 0;
	
	}

}

Java:
package A;

import javax.swing.JFrame;

public class StartFrame extends JFrame {
	
	
	
	public StartFrame(int x, int y, String titel) {
		
		this.setSize(x, y);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle(titel);
		this.setLocation(500, 200);
		
	}

}

Java:
package A;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;



public class Start {
	
	
	
	public static void main(String[] args) {
		
		StartFrame frame = new StartFrame(1000, 600, "Start");
		StartPanel panel = new StartPanel(frame);
		
		
		
		
	}

	
	
	

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
M Umwandlung in den HSV-Farbraum lässt die Grafik pixelig werden AWT, Swing, JavaFX & SWT 8
S 2D-Grafik Winkelberechnungen auf 2D Grafik AWT, Swing, JavaFX & SWT 2
E Grafik karte erkennen AWT, Swing, JavaFX & SWT 3
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
D Swing JCombobox Aktion löscht Grafik AWT, Swing, JavaFX & SWT 1
K Grafik in JFrame einpassen AWT, Swing, JavaFX & SWT 3
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
S Höhendaten in einer Grafik ausgeben AWT, Swing, JavaFX & SWT 2
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
S Grafik in einer Klassen einfügen/hinzufügen AWT, Swing, JavaFX & SWT 1
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
F AWT Grafik wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 2
J JTabbedPane Grafik unterhalb der Tabs AWT, Swing, JavaFX & SWT 3
F Grafik hängt sich auf AWT, Swing, JavaFX & SWT 20
S LookAndFeel GUI-Grafik AWT, Swing, JavaFX & SWT 5
J Verschwommene Grafik AWT, Swing, JavaFX & SWT 4
C LayoutManager Grafik soll nicht im GridLayout Skalieren AWT, Swing, JavaFX & SWT 3
F Grafik mit Buttons versehen AWT, Swing, JavaFX & SWT 8
C Grafik Taschenrechner AWT, Swing, JavaFX & SWT 5
Kenan89 Grafik und Text in JPanel anzeigen AWT, Swing, JavaFX & SWT 8
D Fenster mit Grafik überlappen AWT, Swing, JavaFX & SWT 3
Maxim6394 Rotation einer Grafik in swing AWT, Swing, JavaFX & SWT 13
D Swing Grafik in JPanel anzeigen. AWT, Swing, JavaFX & SWT 3
W Grafik von JFrame korrekt speichern AWT, Swing, JavaFX & SWT 7
S Grafik Fehler AWT, Swing, JavaFX & SWT 15
M Swing JLabel (mit einer Grafik) aktualisieren AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Problem beim Drucken eines Grafik-Objekts AWT, Swing, JavaFX & SWT 2
Daniel_L Grafik erstellen, drin zeichnen und dann speichern AWT, Swing, JavaFX & SWT 2
D Grafik über JPanels hinweg verschieben AWT, Swing, JavaFX & SWT 2
C Grafik von main aus aufrufen AWT, Swing, JavaFX & SWT 13
O Swing Label(bzw. Grafik) verdekt von anderm Label AWT, Swing, JavaFX & SWT 2
T rekursive Grafik AWT, Swing, JavaFX & SWT 5
I 2D-Grafik Problem mit schreiben von Text auf eine Grafik AWT, Swing, JavaFX & SWT 7
F Swing Framework gesucht (Swing, Chart, "Scheduling" Grafik) AWT, Swing, JavaFX & SWT 2
S Pacman-Grafik AWT, Swing, JavaFX & SWT 23
N Eigener Grafik Editor mit fehlerhafter Anzeige AWT, Swing, JavaFX & SWT 4
lordcarlos Dynamische und interaktive grafik AWT, Swing, JavaFX & SWT 5
D Systemmodale Grafik AWT, Swing, JavaFX & SWT 10
J Geladene Grafik in ImageIcon auf Panel fest positionern. AWT, Swing, JavaFX & SWT 8
W Grafik aktualisieren AWT, Swing, JavaFX & SWT 5
S Swing Zugriff auf Polyline in Grafik AWT, Swing, JavaFX & SWT 4
A Swing Bei größe verändern des Fensters Grafik weg AWT, Swing, JavaFX & SWT 3
C gute Grafik-Bibliotheken gesucht AWT, Swing, JavaFX & SWT 6
D JFormattedTextfield um Grafik erweitern AWT, Swing, JavaFX & SWT 15
O Grafik wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
P JPanel mit Grafik von HDD über JTree AWT, Swing, JavaFX & SWT 10
S 2D-Grafik beeinflussen durch Scrollbalken AWT, Swing, JavaFX & SWT 2
A Grafik aus MIME-kodiertem Inhalt erzeugen AWT, Swing, JavaFX & SWT 2
T (WACOM) Grafik Tablet abfragen AWT, Swing, JavaFX & SWT 3
S Button mit Grafik versehen AWT, Swing, JavaFX & SWT 5
D Grafik bearbeiten AWT, Swing, JavaFX & SWT 11
M Ich habe Werte und Brauche Grafik! AWT, Swing, JavaFX & SWT 3
M Grafik flexibel an berechneten Koordinaten positionieren AWT, Swing, JavaFX & SWT 4
M dynamische Grafik in JFrame einbetten AWT, Swing, JavaFX & SWT 2
G Transparente Grafik über JMF Video zeichnen AWT, Swing, JavaFX & SWT 2
I Grafik in Text umwandeln AWT, Swing, JavaFX & SWT 11
G Grafik auf mehrere Methoden/Klassen zerlegen AWT, Swing, JavaFX & SWT 2
G Grafik in Button einbinden AWT, Swing, JavaFX & SWT 3
M Grafik in JFrame in Kombination mit Steuerelementen AWT, Swing, JavaFX & SWT 2
T grafik in jpanel wird nicht neugezeichnet AWT, Swing, JavaFX & SWT 7
F Zellen über eine Grafik legen AWT, Swing, JavaFX & SWT 7
S Grafik Farbwert verändern? AWT, Swing, JavaFX & SWT 8
D Farbe einer Grafik über den Cursor abfragen AWT, Swing, JavaFX & SWT 6
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2
S Popup auf Grafik AWT, Swing, JavaFX & SWT 18
J Grafik "sichtbar" verschieben AWT, Swing, JavaFX & SWT 2
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
G Grafik erzeugen: eine Art Zustandsgraph eines Automaten AWT, Swing, JavaFX & SWT 7
P grafik in JScrollPanel AWT, Swing, JavaFX & SWT 5
D AppletCode als JAR aus JSP benutzen und als Grafik speichern AWT, Swing, JavaFX & SWT 2
S Update von Grafik auf JPanel AWT, Swing, JavaFX & SWT 2
S Auf einem JTabbedPane eine Grafik zeichnen AWT, Swing, JavaFX & SWT 11
W Grafik in JLabel aktualisieren AWT, Swing, JavaFX & SWT 4
S Tooltip mit Grafik AWT, Swing, JavaFX & SWT 2
D Visualisierung einer Selektion in einer Grafik. AWT, Swing, JavaFX & SWT 7
P Vektor-Grafik im XML-Format speichern AWT, Swing, JavaFX & SWT 39
P Grafik auf Button AWT, Swing, JavaFX & SWT 3
E Einträge der JComboBox werden durch Grafik verdeckt AWT, Swing, JavaFX & SWT 11
L Komponente und Grafik gleichzeitig auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
T swing - grafik schrittweise ausgeben ohne repaint() AWT, Swing, JavaFX & SWT 2
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
L 2D-Grafik Linie von Kreis zu Kreis AWT, Swing, JavaFX & SWT 3
S Kreis vergrößern/verkleinern mit Buttons AWT, Swing, JavaFX & SWT 1
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
L 2D-Grafik Dreieck in einem Kreis??? AWT, Swing, JavaFX & SWT 1
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
D Swing Manuellen Kreis zeichen AWT, Swing, JavaFX & SWT 22
T Kreis in Jlabel darstellen. AWT, Swing, JavaFX & SWT 13
E Kreis-Mal-Programm AWT, Swing, JavaFX & SWT 7
S Kreis in Kreis AWT, Swing, JavaFX & SWT 5
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
M 2D-Grafik "Unvollständiger" Kreis(kontur) AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben