7

i am writing a program that when the mouse is clicked, a circle will be drawn. The below code i've wrote so far.

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.event.*;
import java.awt.geom.*;

public class test extends JFrame implements ActionListener, MouseListener {
    Shape circle = new Ellipse2D.Float(10, 10, 10, 10);

    public test () {
        setSize(250,150);
        addMouseListener(this);
    }

    public static void main(String[] args) {
        //TODO code application logic here
        java.awt.EventQueue.invokeLater(new Runnable() {
              public void run() {
                   test frame = new test();
                   frame.setVisible(true);
              }
        });
    }

    public void actionPerformed(ActionEvent ae) {

    }

    public void drawCircle(int x, int y) {
        Graphics g = this.getGraphics();
        g.drawOval(x, y, x, y);
        g.setColor(Color.BLACK);
        g.fillOval(x, y, 2, 2);
    }

    public void mouseClicked(MouseEvent e) {
        drawCircle(e.getX(), e.getY());
        repaint();
    }

    public void mouseExited(MouseEvent e) {

    }

    public void mousePressed(MouseEvent e) {

    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }
}

The code is a 400X400 jframe, when clicked open display a circle at a half seconds, The problem is that, when i release the mouse, the circle disappear. why?

StanislavL
  • 56,971
  • 9
  • 68
  • 98
hkguile
  • 4,235
  • 17
  • 68
  • 139

2 Answers2

11

Change your mouseClick(...) to:

int x, y;

public void mouseClicked(MouseEvent e) {
    x = e.getX();
    y = e.getY();

    repaint();
}

Override paint(...):

@Override
public void paint(Graphics g) {
    drawCircle(x, y);
}
wannik
  • 12,212
  • 11
  • 46
  • 58
5

When you call repaint(), the component gets painted again from scratch. You're circle is wiped away. You will want to override paintComponent(Graphics) which is called every time the component is painted.

Adam Paynter
  • 46,244
  • 33
  • 149
  • 164
  • You could also save all drawn circles in an array or list and redraw them everytime – Matthias Bruns Nov 09 '11 at 09:53
  • @Traxdata: Yeah, I was thinking about mentioning that, but this question seemed like a homework question, so I left it to him. :) – Adam Paynter Nov 09 '11 at 09:56
  • trapped again... :D Anyway overriding paintComponent(Graphics) would be too hard if it's homework – Matthias Bruns Nov 09 '11 at 10:12
  • 3
    Note that the OP is painting in a top level container. `JFrame` and other TLCs have no `paintComponent(Graphics)` method. OTOH it is best **not** to override `paint(Graphics)` in a TLC, but instead use a `JComponent` or `JPanel` - which has the `paintComponent(Graphics)` method. – Andrew Thompson Nov 09 '11 at 10:33