Objekt lässt sich nicht bewegen

Ich habe gerade ein Java-Programm geschrieben. Es stellt einen roten Kreis in einem Fenster dar, den man mit der Maus anstoßen kann. Der Ball soll sich bewegen und an den Fensterrändern abprallen. Das Programm ist fertig und der Kreis wird auch dargestellt, leider kann man ihn nicht bewegen. Ich finde meinen Fehler nicht, kann mir jemand helfen?:confused:
Der Quellcode lautet:
Code:
package mousecollision;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
/**
 *
 * @author lars
 */
public class Main extends JFrame{
    Ball dot;
    double x; //aktuelle Mauskoordinaten
    double y; //aktuelle Mauskoordinaten
    double ox;//alte Mauskoordinaten
    double oy;//alte Mauskoordinaten
    public static int auflosung=500;//größe des Fenster
    public Main()
        {super("Mause-Kollision");
        setSize(auflosung,auflosung);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        dot=new Ball();
        dot.ref=this;
        addMouseMotionListener(new mouse());}
    class mouse implements MouseMotionListener
        {
        public void mouseMoved(MouseEvent me)
            {ox=x; oy=y; x=me.getX(); y=me.getY();//koordinaten erneuern
            if(dot.collision(x, y)) //wenn eine Kollision vorliegt
                {dot.movex=(x-ox); dot.movey=(y-oy);} //geschwindigkeit des Ball anpassen. Je größer der unterschied zwischen den alten und den neuen Mauskoordinaten ist, desto schneller wird der Ball
            }
        public void mouseDragged(MouseEvent me){}//unnötig
        }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main test=new Main();
    }
    public void paint(Graphics g)
        {g.clearRect(0, 0, auflosung, auflosung);
         g.setColor(Color.red);
        g.drawOval((int) dot.x, (int) dot.y, (int) dot.rad, (int) dot.rad);}//ball zeichnen

}
class Ball
    {
    public Main ref;
    public double rad=10; //radius
    public double x=50;  //absolute kords
    public double y=50;  //absolute kords
    public double movex=1;  //per ms
    public double movey=1;  //per ms
    Thread a;
    public double start=0; //zeit um die geschwindigkeit des Balls konstant zu halten
    public double stop=0;
    public double speed=5;
    class Movement implements Runnable
        {public void run()
            {stop=System.currentTimeMillis();
             double difference=stop-start;
             start=System.currentTimeMillis();
             x+=movex*difference/speed;//ball bewegen
             y+=movey*difference/speed;
             
             
             //kontrollieren ob der Ball noch im Fenster liegt. Mit etwas Spielraum versehen
             if(x<rad){x=rad; movex=-movex;}
             if(y<rad){y=rad; movey=-movey;}
             if(x>(Main.auflosung-rad)){x=Main.auflosung-rad; movex=-movex;}
             if(y>(Main.auflosung-rad)){y=Main.auflosung-rad; movey=-movey;
             
             //fenster und ball neu zeichnen
             ref.repaint();}
            }
        }
    public Ball()
        {
        //der Thread sorgt dafür, dass der ball sich ständig bewegt.
        a=new Thread(new Movement());}
    
    //wird aufgerufen, wenn die Mauskoordinaten in Main abgefragt werden. liegt eine Kollision vor, so wird die Geschwindigkeit vom Ball geändert.
    public boolean collision(double x, double y)
        {
        double dx=this.x-x;
        double dy=this.y-y;
        double distance=Math.sqrt(Math.pow(dx, 2)+Math.pow(dy, 2));
        if(distance<=10)return true;
        return false;
        }
    }
 

mccae

Senfdazugeber
Ich habe gerade ein Java-Programm geschrieben. Es stellt einen roten Kreis in einem Fenster dar, den man mit der Maus anstoßen kann. Der Ball soll sich bewegen und an den Fensterrändern abprallen. Das Programm ist fertig und der Kreis wird auch dargestellt, leider kann man ihn nicht bewegen. Ich finde meinen Fehler nicht, kann mir jemand helfen?:confused:
Der Quellcode lautet:
Java:
package mousecollision;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
/**
 *
 * @author lars
 */
public class Main extends JFrame{
    Ball dot;
    double x; //aktuelle Mauskoordinaten
    double y; //aktuelle Mauskoordinaten
    double ox;//alte Mauskoordinaten
    double oy;//alte Mauskoordinaten
    public static int auflosung=500;//größe des Fenster
    public Main()
        {super("Mause-Kollision");
        setSize(auflosung,auflosung);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        dot=new Ball();
        dot.ref=this;
        addMouseMotionListener(new mouse());}
    class mouse implements MouseMotionListener
        {
        public void mouseMoved(MouseEvent me)
            {ox=x; oy=y; x=me.getX(); y=me.getY();//koordinaten erneuern
            if(dot.collision(x, y)) //wenn eine Kollision vorliegt
                {dot.movex=(x-ox); dot.movey=(y-oy);} //geschwindigkeit des Ball anpassen. Je größer der unterschied zwischen den alten und den neuen Mauskoordinaten ist, desto schneller wird der Ball
            }
        public void mouseDragged(MouseEvent me){}//unnötig
        }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main test=new Main();
    }
    public void paint(Graphics g)
        {g.clearRect(0, 0, auflosung, auflosung);
         g.setColor(Color.red);
        g.drawOval((int) dot.x, (int) dot.y, (int) dot.rad, (int) dot.rad);}//ball zeichnen

}
class Ball
    {
    public Main ref;
    public double rad=10; //radius
    public double x=50;  //absolute kords
    public double y=50;  //absolute kords
    public double movex=1;  //per ms
    public double movey=1;  //per ms
    Thread a;
    public double start=0; //zeit um die geschwindigkeit des Balls konstant zu halten
    public double stop=0;
    public double speed=5;
    class Movement implements Runnable
        {public void run()
            {stop=System.currentTimeMillis();
             double difference=stop-start;
             start=System.currentTimeMillis();
             x+=movex*difference/speed;//ball bewegen
             y+=movey*difference/speed;
             
             
             //kontrollieren ob der Ball noch im Fenster liegt. Mit etwas Spielraum versehen
             if(x<rad){x=rad; movex=-movex;}
             if(y<rad){y=rad; movey=-movey;}
             if(x>(Main.auflosung-rad)){x=Main.auflosung-rad; movex=-movex;}
             if(y>(Main.auflosung-rad)){y=Main.auflosung-rad; movey=-movey;
             
             //fenster und ball neu zeichnen
             ref.repaint();}
            }
        }
    public Ball()
        {
        //der Thread sorgt dafür, dass der ball sich ständig bewegt.
        a=new Thread(new Movement());}
    
    //wird aufgerufen, wenn die Mauskoordinaten in Main abgefragt werden. liegt eine Kollision vor, so wird die Geschwindigkeit vom Ball geändert.
    public boolean collision(double x, double y)
        {
        double dx=this.x-x;
        double dy=this.y-y;
        double distance=Math.sqrt(Math.pow(dx, 2)+Math.pow(dy, 2));
        if(distance<=10)return true;
        return false;
        }
    }

Huhu,
Zuerst einmal würde ich dich bitten java statt code tags zu benutzen :)

Hast du denn bis jetzt Versuche gemacht nach dem Problem zu suchen?

Bist du mit dem Debugger Breakpoint für Breakpoint (Ich nehme an du hast welche gesetzt) durchgegangen und hast geschaut ob alles passt?

Falls nicht, solltest du das tun.
Ich zumindest finde dann meistens die Problemursache und muss keinen Thread à la: "Hilfe es geht nicht, ich habs mehrmals durchgelesen, finde den Fehler nicht" öffnen :p
 

RoCMe

Erfahrenes Mitglied
Hallo!

mccae hat Recht - eigentlich müsstest du erst mal selbst anfangen zu suchen. Mit einem Debugger finde ich das aber ziemlich ungemütlich, wenn es um GUI basierte Dinge geht. System.out.println() hat mich hier schneller zum Ziel geleitet:

Du erzeugst einen neuen Thread, aber gestartet wird der nicht - nur erzeugt. Das führt dann dazu, dass nichts neugezeichnet wird...

Wenn man den Thread an der Stelle, wo er erzeugt wird, mit "a.start();" startet, gibts eine nullPointer Exception. Aber da darfst du jetzt selbst weitersuchen ;-p

Gruß,

RoCMe