Java 跟踪鼠标坐标并允许在窗口中绘制线的程序

Java 跟踪鼠标坐标并允许在窗口中绘制线的程序,java,jframe,jpanel,drawing,mouseevent,Java,Jframe,Jpanel,Drawing,Mouseevent,程序应执行以下操作: 打开窗户。获取鼠标在窗口中的位置(x和y坐标),并将其设置为窗口的标题 如果你点击并按住鼠标左键,你应该能够画一条线 问题是当我运行程序时,1号可以工作,但不是2号。调整窗口大小时,坐标冻结,但我可以画线 希望有人能帮上忙 import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt

程序应执行以下操作:

  • 打开窗户。获取鼠标在窗口中的位置(x和y坐标),并将其设置为窗口的标题
  • 如果你点击并按住鼠标左键,你应该能够画一条线
  • 问题是当我运行程序时,1号可以工作,但不是2号。调整窗口大小时,坐标冻结,但我可以画线

    希望有人能帮上忙

    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());
        }
    }
    
    这里有几件事:

    当您想要自定义
    组件
    的绘制时,请覆盖其
    绘制组件
    方法,不要尝试使用
    getGraphics
    获取其
    图形
    对象

    使用
    repaint()
    重新绘制
    组件(即
    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);
        }
    
    }