跟踪鼠标坐标并允许在 window 中画线的程序

Program that tracks mouse coordinates and allows to draw lines in a window

程序应执行以下操作:

  1. 打开一个window。获取鼠标在 Window 中的位置(x 和 y 坐标)并将这些设置为 window.
  2. 的标题
  3. 如果您单击并按住鼠标左键,您应该可以画一条线。

问题是当我运行程序没有。 1 有效,但不是没有。 2. 调整 Window 后,坐标冻结,但我可以画线。

希望有人能帮忙。

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel {

    private Point lastPoint;


    public Main() {
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                lastPoint = new Point(e.getX(), e.getY());
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                Graphics g = getGraphics();
                g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY());
                lastPoint = new Point(e.getX(), e.getY());
                g.dispose();
            }
        });
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setResizable(true);
        frame.setVisible(true);
        frame.getContentPane().add(new Main(), BorderLayout.CENTER);
        frame.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                String xstring = String.valueOf(x);
                String ystring = String.valueOf(y);
                frame.setTitle(xstring + ", " +  ystring);
        }
        });
        }

}

如果将以下内容添加到 MouseMotionAdapter,您可以在拖动鼠标时看到标题是如何调整的。 也许你可以从那里继续。

public void mouseDragged(MouseEvent e) {
  int x = e.getX();
  int y = e.getY();
  String xstring = String.valueOf(x);
  String ystring = String.valueOf(y);
  frame.setTitle("dragged - " + xstring + ", " + ystring);
}

稍作试验后得出以下代码:

public class Draw {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setResizable(true);
        frame.setVisible(true);
        JPanel myPanel = new MyPanel();
        frame.getContentPane().add(myPanel, BorderLayout.CENTER);
        myPanel.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                String xstring = String.valueOf(x);
                String ystring = String.valueOf(y);
                frame.setTitle(xstring + ", " + ystring);
                ((MyPanel) myPanel).setLastPoint(e);
            }

            public void mouseDragged(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                String xstring = String.valueOf(x);
                String ystring = String.valueOf(y);
                frame.setTitle("dragged - " + xstring + ", " + ystring);

                Graphics g = myPanel.getGraphics();
                Point lastPoint = ((MyPanel) myPanel).getLastPoint();
                g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY());
                ((MyPanel) myPanel).setLastPoint(new Point(e.getX(), e.getY()));
                g.dispose();
            }
        });
    }
}

class MyPanel extends JPanel {
    private Point lastPoint;

    public Point getLastPoint() {
        return lastPoint;
    }

    public void setLastPoint(Point point) {
        lastPoint = point;

    }

    public void setLastPoint(MouseEvent e) {
        lastPoint = new Point(e.getX(), e.getY());
    }
}

这里有几件事:

当你想自定义Component的绘画时,覆盖它的paintComponent方法,不要试图用getGraphics获取它的Graphics对象。

使用 repaint() 重绘您的 Component(即 paintComponent 将被调用)。

让您的 JFrame 只有在添加了所有其他组件后才可见。

以下是您的代码可以如何更改:

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel {

    private Point lastPoint = new Point();
    private Point currentPoint = new Point();

    public Main() {
        addMouseListener(new MouseAdapter() {
            public void mousePressed(final MouseEvent e) {
                lastPoint = new Point(e.getX(), e.getY());
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(final MouseEvent e) {

                currentPoint = new Point(e.getX(), e.getY());
                repaint();

            }
        });
    }

    @Override
    public void paintComponent(final Graphics g) {

        super.paintComponent(g);

        g.drawLine(lastPoint.x, lastPoint.y, currentPoint.x, currentPoint.y);

    }

    public static void main(final String[] args) {
        // TODO Auto-generated method stub
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setResizable(true);

        frame.getContentPane().add(new Main(), BorderLayout.CENTER);
        frame.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(final MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                String xstring = String.valueOf(x);
                String ystring = String.valueOf(y);
                frame.setTitle(xstring + ", " + ystring);
            }
        });
        frame.setVisible(true);
    }

}