java – 在JFrame中拖动JPanel

我在JButton点击上将JPanel添加到JFrame.它将JPanel添加到框架中.该按钮将继续在点击事件上将JPanel添加到JFrame.没有限制.单击按钮时,我也将JPanel添加到List中.我这样做是因为使用for循环添加MouseMotionListener来处理拖拽JPanel的问题.

我现在面临的问题是阻力.当我添加第一个JPanel时,如果我拖动它,它会正确跟随鼠标光标坐标.当我添加第二个JPanel时,它也完全跟随鼠标.添加第二个后,如果尝试拖动第一个JPanel,第一个JPanel似乎遵循不同的坐标,初始位置将更改为其他位置.我不知道我在哪里犯了这个错误.请帮我解决这个问题.请仔细阅读以下代码.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class MyFrame extends JFrame {

    JButton jb;
    List<JPanel> mypanels = new ArrayList<JPanel>();
    public MyFrame() {
        jb = new JButton("Add Panel");
        jb.setBounds(10, 10, 100, 50);
        setSize(new Dimension(1000, 600));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);
        add(jb);
        setVisible(true);
        initialize();
    }


    public void initialize() {

        jb.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                JPanel panel = new JPanel();
                panel.setBounds(150,150,200,200);
                panel.setBackground(Color.black);
                mypanels.add(panel);
                add(panel);
                repaint();
                handleDrag();
            }
        });

    }

    public void handleDrag(){
        for(int i=0;i<mypanels.size();i++) {
            final int j = i;
            mypanels.get(i).addMouseMotionListener(new MouseMotionAdapter() {

                @Override
                public void mouseDragged(MouseEvent me) {
                    me.translatePoint(me.getComponent().getLocation().x, me.getComponent().getLocation().y);
                    mypanels.get(j).setLocation(me.getX(), me.getY());
                }

            });
        }
    }

    public static void main(String args[]) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                new MyFrame();
            }
        });

    }


}

解决方法:

>也许看看Moving Windows by @camickr
>不要在同一时间将ComponentMover与ComponentResizer结合使用

上一篇:javascript – raphaeljs如何使用约束运动限制元素拖动(在父边界框内)


下一篇:javascript – 在HTML5本机拖动期间检测keydown / up事件