GUI Kreis zeichnen

Hallo, hänge an folgender Aufgabe:
"Es soll ein JFrame geschrieben werden, der über MouseAdapter bei MousePressed den aktuellen Punkt der Maus als Mittelpunkt speichert und bei MouseDragged einen Kreis zeichnet mit dem Abstand zwischen Mittelpunkt und Maus als Radius"

Code:
public class kreiszeichnen extends JPanel{
    Point mittelPunkt = new Point();
    int radius=0;
   
    public class MeinMouseListener extends MouseAdapter{
        public void mousePressed(MouseEvent e) {
            mittelPunkt=e.getPoint();
           
        }
        public void mouseDragged(MouseEvent e) {
            radius=mittelPunkt.x-e.getX();
repaint();
           
        }       
    }
   
    public kreiszeichnen() {
        MeinMouseListener listener= new MeinMouseListener();
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }
    public void paint(Graphics g) {
        g.fillOval(mittelPunkt.x, mittelPunkt.y, radius, radius);
    }
public static void main(String[] args) {
    JFrame mf=new JFrame();
    mf.setSize(250, 150);
    mf.setVisible(true);
    mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JComponent n=new kreiszeichnen();
    mf.setContentPane(n);
    n.setOpaque(false);
}
}
Kann mir jemand weiterhelfen? Wenn ich das Programm zum Laufen bringe, passiert nichts...
 
Ein paar Hinweise:
- berechne den absoluten Wert zwischen Mittelpunkt und aktueller Mauskoordinate (negative Radien gibt es noch nicht :p )
- setVisible(true) erst zum Schluss aufrufen
- benutz paintComponent(Graphics) anstatt paint(Graphics)
 
Bei mir wird ein Fenster angezeigt.
Bei mir auch, ich meine der Kreis wird nicht gezeichnet.

Ein paar Hinweise:
- berechne den absoluten Wert zwischen Mittelpunkt und aktueller Mauskoordinate (negative Radien gibt es noch nicht :p )
- setVisible(true) erst zum Schluss aufrufen
- benutz paintComponent(Graphics) anstatt paint(Graphics)
paint(Graphics) ist von der Aufgabe her vorgegeben...
Vielen Dank für den Tipp mit dem Radius, jetzt hat es geklappt!

/edit: eine Frage hätte ich dennoch, jetzt ist das ganze aber nicht der Mittelpunkt wenn ich den Kreis zeichne. Wie würde man das hinkriegen?
 
Wenn radius tatsächlich den Radius meint, müsste es richtig heißen
Code:
g.fillOval(mittelPunkt.x-radius, mittelPunkt.y-radius, radius*2, radius*2);
 
zum Verständnis, fillOval's breite mal höhe ist als Durchmesser jeweils anzusehen, richtig?
Ja, wie bereits geschrieben: Du gibst das Rechteck an, in das das Oval gezeichnet werden soll.

Mal im Zusammenhang:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test {

    private static class KreisPanel extends JPanel {
        private Point mittelpunkt = new Point();
        private int radius=0;

        public void setMittelpunkt(Point p) {
            mittelpunkt = p;
        }

        public void setRandpunkt(Point p) {            
            int dx = mittelpunkt.x - p.x;
            int dy = mittelpunkt.y - p.y;
            setRadius((int)(Math.sqrt(dx*dx + dy*dy)));
        }

        public void setRadius(int radius) {
            this.radius = radius;
            repaint();
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.fillOval(mittelpunkt.x - radius, mittelpunkt.y - radius, 
                       radius*2, radius*2);
        }
    }
 
    public class Kreiszeichner extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            KreisPanel panel = (KreisPanel) e.getComponent();
            panel.setMittelpunkt(e.getPoint());
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            KreisPanel panel = (KreisPanel) e.getComponent();
            panel.setRandpunkt(e.getPoint());
        }      
    }
   
    public void createAndShowGUI() {
        KreisPanel panel = new KreisPanel();
        Kreiszeichner listener= new Kreiszeichner();
        panel.addMouseListener(listener);
        panel.addMouseMotionListener(listener);

        JFrame mf=new JFrame();
        mf.add(panel);
        mf.setSize(250, 150);
        mf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mf.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().createAndShowGUI());
    }
}
 
Hallo Leute,
ich habe ein ähnliches Problem,
ich will ein (EggTimer)-Canvas der Größe 320x320 bauen und darin
einen Kreis mit 300 Pixel Durchmesser setzen:
Die Methode paint (Graphics g) ist auch vorgegeben

Code:
public void paint(Graphics g) {

g.drawOval(10, 10, 299, 299);
Ich habe das wie folgt angesetzt:
width und height sind 300 Pixel da in der Doku steht
"The oval covers an area that is width + 1 pixels wide and height + 1 pixels tall ", habe ich 299 genommen.
Jetzt muss ich noch rausfinden, was x und y sind:

x=320/2-radius
y=320/2-radius

Der Radius ist 150, also sind
x=160-150=10
y=160-150=10 ?

Ist mein Ansatz richtig?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben