views:

52

answers:

2

Hi, I'm trying to display mouse coordinates (math coordinates) in my JPanel , but i get each coordinates on top of the other ,can' figure out why . here's my code :

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.applet.*;

import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;

public class drawarea extends JPanel {

    int n;
    private Point mouseCoords = null;
    int UNIT = 20;

    drawarea() {
        super();
        setBackground(Color.white);
        addMouseMotionListener(new MouseInputAdapter() {

            public void mouseMoved(MouseEvent e) {
                super.mouseMoved(e);
                mouseCoords = new Point(e.getX(), e.getY());
                repaint();
            }

            /**
             * @see java.awt.event.MouseListener#mouseExited(MouseEvent)
             */
            public void mouseExited(MouseEvent e) {
                super.mouseExited(e);
                mouseCoords = null;
                repaint();
            }
        });
        setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
    }

    public void paint(Graphics g) {

        //draw axis x and y
        g.setColor(Color.red);
        g.drawLine(0, r.height / 2, r.width, r.height / 2);
        g.drawLine(r.width / 2, 0, r.width / 2, r.height);

        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        dessinBoule(g2);
    }

    private void dessinBoule(Graphics2D g) {
        // if mouse isnt inside the ara where
        // i want the coordinates to bes displayed
        if (mouseCoords == null) {
            return;
        }
        g.setColor(Color.BLACK);

        int decPolice = 15;

        g.drawString("x = " + getFormatedString("" + mouseCoords.x)
            + " , y = " + getFormatedString("" + mouseCoords.y), 2, 15);
    }

    private String getFormatedString(String s) {
        if (s.length() > 4) {
            return s.substring(0, 3);
        }
        return s;
    }
}

thanks.

+3  A: 

You're drawing on your graphics area, so g.drawString(...) draws a string on top of what is already there. You must either erase what is there first, by drawing a rectangle in the background colour, or use a separate component that you can manage with a separate paint(...) method.

richj
As your paint method paints a complete image each time, the easiest thing for you to try is to add g.clearRect(0, 0, getWidth(), getHeight()); as the first line in your paint() method. This will ensure that you start painting on a rectangle filled with the background colour instead of on top of the old image.
richj
+1  A: 

An example of @richj's suggestion is shown below. Note that in Swing you should override paintComponent(). Also, the implementation of MouseInputAdapter is empty, so you don't need to invoke super().

import java.awt.*;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;

public class DrawArea extends JPanel {

    private Point mouseCoords = new Point();

    DrawArea() {
        super();
        this.setPreferredSize(new Dimension(320, 240));
        setBackground(Color.white);
        addMouseMotionListener(new MouseInputAdapter() {

            @Override
            public void mouseMoved(MouseEvent e) {
                mouseCoords = e.getPoint();
                repaint();
            }

            @Override
            public void mouseExited(MouseEvent e) {
                mouseCoords = null;
                repaint();
            }
        });
        setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.clearRect(0, 0, getWidth(), getHeight());
        g2.setColor(Color.red);
        if (!(mouseCoords == null)) {
            g2.drawString(mouseCoords.toString(), 10, getHeight() - 10);
        }
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new DrawArea());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }
}
trashgod