Halbkreiszeichnen(Canvas) - Diesen mit Mouseevents bestücken

Marczii

Mitglied
Hallo,

Und zwar will ich für mein Projekt ein Mouseevent entwerfen, dass beim Klicken auf Buttons etc. Einen Mausklick symbolisiert. Dabei soll ein Halbkreis kleiner werden, wie in diesem Video gezeigt.

->

Ich weiß auch nicht, ob ich auf einem guten Weg bin oder nicht. So sehen erstmal meine Klassen aus wie Ich es gedacht habe.


public class Circle {

private int x;
private int y;
private int diameter;
private Color color;

public Circle(int x, int y, int diameter, Color color) {

super();
this.x = x;
this.y = y;
this.diameter = diameter;

}


public int getX() {
return x;
}

public int getY() {
return y;
}

public int getDiameter() {
return diameter;
}
public Color getColor() {
return color;
}

public void draw (GraphicsContext gc) {

gc.setStroke(Color.CORAL);
gc.setLineWidth(4);
gc.strokeOval(10, 20, 40, 40);
}

}

public class CircleClickListener extends MouseAdapter {

public CircleClickListener(CirclePanel panel) {
this.panel = panel;
}

private CirclePanel panel;

@Override
public void mouseClicked(MouseEvent e) {
panel.addCircle(new Circle(e.getX() - 12 ,e.getY() - 12, 24, Color.BLUE));
}

@Override
public void mousePressed(MouseEvent e) {

}

@Override
public void mouseMoved(MouseEvent e) {


}

@Override
public void mouseReleased(MouseEvent e) {

}
}

public class CirclePanel extends JPanel {

private List<Circle> circles = new LinkedList<Circle>();

public void addCircle(Circle circle) {
circles.add(circle);
this.repaint();
}

@Override
public void paint(Graphics g) {
for (Circle c : circles) {
c.draw(g);
}
}
}

public class Main {

public static void main(String[] args) {

JFrame window = new JFrame("Circles");
CirclePanel panel = new CirclePanel();
window.setContentPane(panel);
panel.addMouseListener(new CircleClickListener(panel));

window.setSize(500,500);
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.setVisible(true);


}
}

Beim Klicken hatte ich vorher schon einen Kreis gezeichnet. Dies ist aber ja nicht genau die Umsetzung, die Ich versuche zu bekommen. Ich hoffe ihr könnt mir ein paar Tipps geben!
 
Meinst Du in etwa so ?
Java:
import javax.swing.JFrame;

public class start {
    public static void main(String[] args) {
        JFrame frame = new JFrame("click Circle");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ClickPanel panel = new ClickPanel(400, 400);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.Timer;

public class ClickCircle implements ActionListener {
    private Point pos = null;
    private Timer timer = null;
    private int diameter = 30;
    private Color color = Color.BLUE;
    private JComponent parent = null;

    public ClickCircle(JComponent parent, Point pos, int delay) {
        start(parent, delay, pos);
    }

    public ClickCircle(JComponent parent, Point pos, int delay, int diameter, Color color) {
        this.diameter = diameter;
        this.color = color;
        start(parent, delay, pos);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (diameter > 0)
            diameter--;
        else
            timer.stop();
        parent.repaint();
    }

    public void draw(Graphics g) {
        int radius = diameter / 2;
        Color old = g.getColor();
        g.setColor(color);
        g.drawOval(pos.x - radius, pos.y - radius, diameter, diameter);
        g.setColor(old);
    }

    public boolean isActive() {
        return timer.isRunning();
    }

    private void start(JComponent parent, int delay, Point pos) {
        this.pos = new Point(pos.x, pos.y);
        this.parent = parent;
        timer = new Timer(delay, this);
        timer.start();
    }
}

Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class ClickPanel extends JPanel implements MouseListener {
    private ClickCircle[] circles = new ClickCircle[30]; // buffer

    public ClickPanel(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        addMouseListener(this);
    }

    private void addCircle(Point p) {
        for (int i = 0; i < circles.length; i++) {
            if (circles[i] == null) {
                circles[i] = new ClickCircle(this, p, 50);
                return;
            }
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        addCircle(e.getPoint());
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < circles.length; i++) {
            if (circles[i] != null) {
                if (circles[i].isActive())
                    circles[i].draw(g);
                else
                    circles[i] = null;
            }
        }
    }
}
😉
 

Zurück
Oben