在GridLayout中拖放组件时的Java位置

在GridLayout中拖放组件时的Java位置,java,drag-and-drop,jlabel,Java,Drag And Drop,Jlabel,我试图通过将图标从一个JLabel拖放到另一个JLabel来进行简单的练习,但完全卡住了。如果有人能帮助我并很快解释我错的原因,我会很高兴的 我想做的是,当鼠标按下标签时,将标签图标设置为null,并将此图标设置为释放鼠标的标签。 JPanel位于LayeredPane上,因为接下来我要做的是在拖动过程中使用此图标显示JLabel。但这是为了未来 目前的问题是: 释放鼠标时,我无法将图标正确设置为标签。。 如《代码》中所述: 第一种方式-当在lab2上设置图标并希望返回到lab1时,无法将图标设

我试图通过将图标从一个JLabel拖放到另一个JLabel来进行简单的练习,但完全卡住了。如果有人能帮助我并很快解释我错的原因,我会很高兴的

我想做的是,当鼠标按下标签时,将标签图标设置为null,并将此图标设置为释放鼠标的标签。 JPanel位于LayeredPane上,因为接下来我要做的是在拖动过程中使用此图标显示JLabel。但这是为了未来

目前的问题是: 释放鼠标时,我无法将图标正确设置为标签。。 如《代码》中所述:

第一种方式-当在lab2上设置图标并希望返回到lab1时,无法将图标设置为lab4-NullPointerException 第二种方式-鼠标按下位置始终在同一位置。当我点击Lab1并在lab3上释放鼠标时,图标设置为Lab1 代码:


}

请参阅拖放式Swing教程,了解正确的操作方法。实际上,我必须在不使用TransferHandler的情况下执行此操作。。我知道这很愚蠢,但练习是“手动”完成的:/而且,我真的很想知道为什么MouseRelease location在这种情况下不能像我预期的那样工作,我真的很想了解你试图移动JLabels的这种机制?这方面有一个有效的例子
public class Main extends JFrame{
private JLayeredPane layeredPane;
private JLabel lab1;
private JLabel lab2;
private JLabel lab3;
private JLabel lab4;
private JPanel mainPanel;
ImageIcon yellowCircleIcon = new ImageIcon("circle_yellow.png");

public Main(){

    Dimension size = new Dimension(400, 400);

    layeredPane = new JLayeredPane();
    getContentPane().add(layeredPane);
    layeredPane.setPreferredSize(size);
    layeredPane.addMouseListener(ms);

    mainPanel = new JPanel(new GridLayout(2,2));
    layeredPane.add(mainPanel, JLayeredPane.DEFAULT_LAYER);
    mainPanel.setPreferredSize(size);
    mainPanel.setBounds(0, 0, size.width, size.height);

    lab1 = new JLabel("111");
    lab1.setBackground(Color.black);
    lab1.setOpaque(true);
    lab1.setIcon(yellowCircleIcon);
    lab1.addMouseListener(ms);

    lab2 = new JLabel("222");
    lab2.addMouseListener(ms);

    lab3 = new JLabel("333");
    lab3.addMouseListener(ms);

    lab4 = new JLabel("444");
    lab4.setBackground(Color.black);
    lab4.setOpaque(true);
    lab4.addMouseListener(ms);

    mainPanel.add(lab1);
    mainPanel.add(lab2);
    mainPanel.add(lab3);
    mainPanel.add(lab4);

    setSize(400, 400);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

MouseListener ms = new MouseListener() {

    public void mouseReleased(MouseEvent arg0) {

        //1st way - cannot set icon to lab4
        //when set icon on lab2 and want to go back to lab1 - NullPointerEx.
        JLabel tmp = (JLabel)mainPanel.getComponentAt(arg0.getX(), arg0.getY());

        //2nd way - mouse presses location is always in the same place
        //when I click on Lab1 and release mouse on lab3 - icon is set to lab1
        //tmp = (JLabel)arg0.getComponent();
        tmp.setIcon(yellowCircleIcon);
    }

    public void mousePressed(MouseEvent arg0) {
        JLabel tmp = (JLabel)arg0.getComponent();
        tmp.setIcon(null);
    }

    public void mouseExited(MouseEvent arg0) {}
    public void mouseEntered(MouseEvent arg0) {}
    public void mouseClicked(MouseEvent arg0) {}
};

public static void main(String[] args) {
    new Main();
}