有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何拖动对象

我想拖动一个框,我想我的鼠标光标是我在拖动矩形时在矩形中单击的位置。我尝试了这段代码,当我尝试拖动时,我得到了一堆错误

import objectdraw.*;

import java.awt.*;

public class TouchWindow extends WindowController
{

    private FilledRect a;
    private boolean b;
    private Location c;
    private int x;
    private int y;
    public void begin()
    {
        b=false;
        a=new FilledRect(0,0,50,50,canvas);
    }
    public void onMouseClick(Location pt)
    {
        if(a.contains(pt))
        {
        b=true;
        pt=c;
        }
    }
    public void onMouseDrag(Location pt2)
    {
        if(b==true)
        {
        x=(int)c.getX()-(int)pt2.getX();
        y=(int)c.getY()-(int)pt2.getY();
        a.move(x,y);
        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    嗯,这里有一个例子,虽然不是小程序,但它可以非常简单地移植

    enter image description here

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class ShapeMover {
    
        public ShapeMover() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setTitle("Shape Mover");
    
            initComponents(frame);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String s[]) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new ShapeMover();
                }
            });
    
        }
    
        private void initComponents(JFrame frame) {
            frame.getContentPane().add(new DragPanel());
        }
    }
    
    class DragPanel extends JPanel {
    
        Rectangle rect = new Rectangle(0, 0, 100, 50);
        int preX, preY;
        boolean isFirstTime = true;
        Rectangle area;
        boolean pressOut = false;
        private Dimension dim = new Dimension(400, 300);
    
        public DragPanel() {
            setBackground(Color.white);
            addMouseMotionListener(new MyMouseAdapter());
            addMouseListener(new MyMouseAdapter());
        }
    
        @Override
        public Dimension getPreferredSize() {
            return dim;
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
    
            Graphics2D g2d = (Graphics2D) g;
            if (isFirstTime) {
                area = new Rectangle(dim);
                rect.setLocation(50, 50);
                isFirstTime = false;
            }
    
            g2d.setColor(Color.black);
            g2d.fill(rect);
        }
    
        boolean checkRect() {
            if (area == null) {
                return false;
            }
    
            if (area.contains(rect.x, rect.y, rect.getWidth(), rect.getHeight())) {
                return true;
            }
    
            int new_x = rect.x;
            int new_y = rect.y;
    
            if ((rect.x + rect.getWidth()) > area.getWidth()) {
                new_x = (int) area.getWidth() - (int) (rect.getWidth() - 1);
            }
            if (rect.x < 0) {
                new_x = -1;
            }
            if ((rect.y + rect.getHeight()) > area.getHeight()) {
                new_y = (int) area.getHeight() - (int) (rect.getHeight() - 1);
            }
            if (rect.y < 0) {
                new_y = -1;
            }
            rect.setLocation(new_x, new_y);
            return false;
        }
    
        private class MyMouseAdapter extends MouseAdapter {
    
            @Override
            public void mousePressed(MouseEvent e) {
                preX = rect.x - e.getX();
                preY = rect.y - e.getY();
    
                if (rect.contains(e.getX(), e.getY())) {
                    updateLocation(e);
                } else {
                    pressOut = true;
                }
            }
    
            @Override
            public void mouseDragged(MouseEvent e) {
                if (!pressOut) {
                    updateLocation(e);
                } else {
                }
            }
    
            @Override
            public void mouseReleased(MouseEvent e) {
                if (rect.contains(e.getX(), e.getY())) {
                    updateLocation(e);
                } else {
                    pressOut = false;
                }
            }
    
            public void updateLocation(MouseEvent e) {
                rect.setLocation(preX + e.getX(), preY + e.getY());
                checkRect();
    
                repaint();
            }
        }
    }