Swing JFrame neuzeichnen lassen, position neu berechnen lassen?

Aljosha.k

Mitglied
Guten Abend, ich habe nun ein wenig meinen Spaß mit Java und Swing gehabt, und möchte nun ein bisschen "Dynamik" in mein Projekt bringen, indem ich Objekten "Bewegung" einhauche, wie könnte ich beispielsweise mein drawRect immer wiederholen lassen, mit neuer Position.

Die Bewegung habe ich mir in etwa so vorgestellt:
Code:
int x=0;
x++
x=x%800

g.fillRect(x+740,240,60,60);
Um somit ein Durchlauf, durch die X Achse, zu gewähren und die modulo Operation ist dafür da, den Block auf der anderen Seite wieder "reinfahren" zu lassen.

Hier mein jetziger Code:
Code:
import java.awt.*;
import javax.swing.JFrame;

public class main extends JFrame {
    public main(){
        super();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
   
    public void paint(Graphics g){
        g.drawLine(0,300,800,300);
        g.fillRect(740,240,60,60);
    }
   
    public static void main(String[] args){
        main pc = new main();
        pc.setSize(800,400);
        pc.setVisible(true);
        pc.setLocationRelativeTo(null);
        pc.setResizable(false);
    }

}

MfG Aljosha
 
Hi,

am besten erstellst du einen neuen Thread, der im Hintergrund rechnet. In dem Thread dann einen Endlosschleife (z.B. "while(true)"), in der Schleife dann deine Rechnung für x eine Kurze Pause ( "Thread.sleep()"), damit sich der PC nicht aufhängt und dein rechteck wie bekolppt über den Bildschirm huscht und zum Schluss noch den Methodenaufruf "repaint();"

Damit das ganze funktioniert, musst du die paint methode in ein Label setzen. Sonst zeichnet er immer neue Rechtecke dazu, bis du einen schwarzen Balken hast...

in etwa so sollte es funktionieren:

Java:
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class maain extends JFrame {
    
    int x=0;
    Label label = new Label();
   
    public maain(){
        super();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        add(label);
       
        Thread thread = new Thread(new MeinThread());
        thread.start();
    }
  
    public static void main(String[] args){
        maain pc = new maain();
        pc.setSize(800,400);
        pc.setVisible(true);
        pc.setLocationRelativeTo(null);
        pc.setResizable(false);       
    }
   
    private class Label extends JLabel{
   
        public void paint(Graphics g){
            g.drawLine(0,300,800,300);
            g.fillRect(x+740,240,60,60);
        }               
    }
   
    private class MeinThread implements Runnable{

        @Override
        public void run() {
           
            while(true){
                x--;
                x=x%800;
               
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {}
               
                repaint();
            }           
        }      
    }
}

und du hast noch einen kleinen Gedankenfehler gemacht: es muss x-- sein. Bei x++ wandert das REchteck nach rechts aus dem Bild raus.

LG

Sugan
 
Zuletzt bearbeitet:
Aber benötige ich in diesem Fall überhaupt eine Abbruchbedingung?
Aber ja,im Normalfall sind while schleifen ohne Abbruchbedingungen gefährlich. 😀
 
Wollte eigentlich meinen Post bearbeiten, allerdings ist es nicht möglich.
Nun zu meiner Frage, sollte ich wenn ich nun ein weiteres Grafik Objekt(welches sich unabhängig von dem Block, durch KeyListener bewegt) in einem einzelnem Thread abspielen lassen?
 
In diesem Falle, möchte ich jedoch vor Programm-Ende kein stopp dieser Schleife, wie drücke ich dies dann aus?
Zum Beispiel: while(running)

Nun zu meiner Frage, sollte ich wenn ich nun ein weiteres Grafik Objekt(welches sich unabhängig von dem Block, durch KeyListener bewegt) in einem einzelnem Thread abspielen lassen?
Das hört sich ja fast danach an würdest du ein kleines Spiel probieren wollen, dazu gibt es im hier im Forum einen eigenen Bereich: http://www.java-forum.org/forum/spiele-und-multimedia-programmierung.22/
Dort findest du hilfreiche Tipps&Tricks zu diesem Thema.
 

Neue Themen


Zurück
Oben