java - 如何在java中通过鼠标移动来移动形状

标签 java paintcomponent

我有这段代码,它创建了一个简单的笑脸。我想通过鼠标移动来移动脸部的眼睛。这是代码

int a,b;
public void recieve(int x,int y)
{
    a=x;
    b=y;
    System.out.println("xaxis"+a+"yaxis"+b);
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    System.out.println("x axis: "+a+" -- y axis: "+b);
    g.drawArc(100, 50, 150, 150, 0, 360);
    g.drawArc(125, 65, 40, 40, 0, 360);
    g.drawArc(180, 65, 40, 40, 0, 360);
    g.drawArc(165, 105, 15, 15, 60, 180);


    g.fillOval(a-130, 70, 15, 15);
    g.fillOval(b-185, 70, 15, 15);
}

最佳答案

您需要实现 MouseMotionListener 并将其附加到您的paintComponent() 方法所在的任何 JPanel 子类。在其方法中,修改“a”和“b”变量的值。

下面是一个例子。从你的问题中我不清楚你希望眼睛做什么类型的运动 - 例如瞳孔是否应该始终“看着”鼠标指针而不离开眼睛 - 例如从左眼鼠标指针的 x 坐标中减去 x 的起始值,并从左眼的 y 坐标中减去 x 的起始值正如您的代码片段所示,右眼的鼠标指针并没有真正产生有意义的结果。

因此,在下面的演示中,眼睛只是跟踪鼠标指针。它向您展示了如何拾取鼠标移动事件并获取鼠标的 X 和 Y 坐标 - 如何使用这些坐标以您想要的任何方式调整瞳孔的位置取决于您,并且(希望如此)现在只是一个数学问题。

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class MouseTrackingSmilieFace extends JFrame {

    private int a;
    private int b;

    private JPanel smilieFacePanel = new JPanel() {
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawArc(100, 50, 150, 150, 0, 360);
            g.drawArc(125, 65, 40, 40, 0, 360);
            g.drawArc(180, 65, 40, 40, 0, 360);
            g.drawArc(165, 105, 15, 15, 60, 180);
            g.fillOval(a, b, 15, 15);
            g.fillOval(a+55, b, 15, 15);
            // Register the motion listener
            addMouseMotionListener(new MouseMotionListener() {

                // Do the same thing whether the mouse button is depressed...
                public void mouseDragged(MouseEvent e) {
                    processMovement(e);
                }

                // ... or not.
                public void mouseMoved(MouseEvent e) {
                    processMovement(e);
                }

                /* Process the movement by capturing the x coordinate of the mouse in member variable 'a'
                 * and the y coordinate in member variable 'b'.
                 */
                private void processMovement(MouseEvent e) {
                    a = e.getX();
                    b = e.getY();
                    System.out.println("X = " + a + " Y = " + b);
                    smilieFacePanel.repaint();
                }
            });
        }
    };

    private MouseTrackingSmilieFace() {
        // Invoke the JFrame superclass constructor and configure the frame
        super("Mouse-tracking smilie face");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400,400);
        this.setVisible(true);
        // Add a panel to the frame and draw the face within it.
        this.add(smilieFacePanel);
    }

    public static void main(String[] args) {
        // Create on the Event Dispatch Thread.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MouseTrackingSmilieFace();
            }
        });
    }
}

关于java - 如何在java中通过鼠标移动来移动形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36755610/

相关文章:

java - Swing 问题绘制 2 个图像

java - 我的 JPanel 类没有在我的 JFrame 上绘制矩形?

java - 如何在不调用多个 "draw()"方法的情况下使用 paintComponent()?

java - 如何在恢复代码之前等待 setIcon() 方法执行?

java - JUnit 中的参数化测试方法,而不仅仅是整个类

java - 连接eclipse和数据库

java - HttpServletRequest无法执行getParameter操作

java - GridBagLayout:Swing

java.lang.RuntimeException : java.net.UnknownHostException:主机未解析:

java - 不清除重绘