【问题标题】:problem displaying mouse coordinates on the screen in javajava在屏幕上显示鼠标坐标的问题
【发布时间】:2010-10-02 09:43:00
【问题描述】:

我试图在我的 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;
    }
}

谢谢。

【问题讨论】:

  • “每个坐标都在另一个之上”是什么意思?
  • 例如。我得到 x=12,y=13 然后下一个不会删除前一个它只是显示在它上面。
  • 重新格式化的代码;如果不正确,请恢复。

标签: java swing graphics


【解决方案1】:

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

【讨论】:

  • 由于您的paint方法每次都绘制完整的图像,因此您尝试最简单的方法是添加 g.clearRect(0, 0, getWidth(), getHeight());作为您的paint() 方法的第一行。这将确保您开始在填充了背景颜色的矩形上而不是在旧图像之上进行绘画。
【解决方案2】:

@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();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多