Java 如何通过单击和拖动在JPanel中移动形状

Java 如何通过单击和拖动在JPanel中移动形状,java,swing,jpanel,Java,Swing,Jpanel,因此,我有一个简单的程序,它允许你点击一个JMenu项新建矩形,并在屏幕中央添加一个形状。我的问题是:我如何在窗口中单击并拖动它?我知道我将需要某种类型的鼠标侦听器,但我不确定具体如何实现它 public class SimpleDraw { public static void main(String[] args) { JFrame frame = new UMLWindow(); frame.setDefaultCloseOperation(JF

因此,我有一个简单的程序,它允许你点击一个JMenu项新建矩形,并在屏幕中央添加一个形状。我的问题是:我如何在窗口中单击并拖动它?我知道我将需要某种类型的鼠标侦听器,但我不确定具体如何实现它

public class SimpleDraw {

    public static void main(String[] args) {

        JFrame frame = new UMLWindow();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(30, 30, 1000, 700);
        frame.getContentPane().setBackground(Color.white);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);

        // Display the window.
        frame.setVisible(true);

    }
}

class UMLWindow extends JFrame {
    Squares squares = new Squares();

    private static final long serialVersionUID = 1L;

    public UMLWindow() {
        addMenus();
    }

    public void addMenus() {

        getContentPane().add(squares);

        JMenuBar menubar = new JMenuBar();

        JMenu shapes = new JMenu("Shapes");

        JMenuItem rectangleMenuItem = new JMenuItem("New Rectangle");
        rectangleMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                squares.addSquare(10, 10, 100, 100);
            }
        });

        shapes.add(rectangleMenuItem);

        menubar.add(shapes);

        setJMenuBar(menubar);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

}

class Squares extends JPanel {
    private static final long serialVersionUID = 1L;

    private List<Rectangle> squares = new ArrayList<Rectangle>();

    public void addSquare(int x, int y, int width, int height) {
        Rectangle rect = new Rectangle(getWidth() / 2 - width / 2, getHeight()
                / 2 - height / 2, width, height);
        squares.add(rect);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setOpaque(true);
        this.setBackground(Color.WHITE);
        Graphics2D g2 = (Graphics2D) g;
        for (Rectangle rect : squares) {
            g2.draw(rect);
        }
        repaint();
    }
}
也许它可以帮助你:

代码的缺点


在这段代码中,我们没有布局管理器。所以,当这个jframe重新调整大小时,如果我们在jframe的中心有一个组件,这个组件可能会显示在jframe的角上。你可以解决这个问题,但有点复杂。如果你愿意,我们可以讨论这个问题

我写了一封信。您可以看到有一个AreaDragger类,听起来像您正在寻找的

一种方法是使用仿射变换来转换形状对象,如中所示。您需要一个MouseListener和一个MouseMotionListenerA完整的示例。这似乎是用于调整大小的。我不想调整大小。我想单击并将整个对象拆分到窗口上的另一个位置,但它将保持不变,此代码支持以下功能:将组件拖放到另一个位置并重新调整此组件的大小。事实上,它有一个额外的功能。如果您不需要此重新调整大小功能,我们可以编辑可调整大小的类,我们只有以下示例:case Cursor.MOVE\u Cursor:。我不知道它是否能帮助您获得令人愉快的代码。