在java中在屏幕上显示鼠标坐标的问题

时间:2010-10-02 09:43:01

标签: java swing graphics

我正试图在我的JPanel中显示鼠标坐标(数学坐标),但是我将每个坐标放在另一个上面,可以找出原因。 这是我的代码:

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;
    }
}

感谢。

2 个答案:

答案 0 :(得分:3)

你正在绘制你的图形区域,所以g.drawString(...)在已经存在的东西之上绘制一个字符串。您必须首先擦除存在的内容,通过在背景颜色中绘制矩形,或者使用可以使用单独的paint(...)方法管理的单独组件。

答案 1 :(得分:1)

@ richj的建议示例如下所示。请注意,在Swing中,您应该覆盖paintComponent()。此外,MouseInputAdapter的实现为空,因此您无需调用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();
            }
        });
    }
}