在GridLayout中拖放期间组件的Java位置

时间:2014-06-24 10:56:48

标签: java drag-and-drop jlabel

我试图通过将图标从一个JLabel拖放到另一个JLabel来完成简单的练习,并完全卡住。如果有人可以帮助我并很快解释为什么我错了,我会很高兴。

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

现在的问题: 鼠标释放时我无法正确设置图标标签.. 如代码所示:

  • 第一种方式 - 在lab2上设置图标并且想要返回实验室1时,无法将图标设置为lab4 - NullPointerException
  • 第二种方式 - 鼠标按下位置始终在同一个地方。当我点击Lab1并在lab3上发布鼠标时 - 图标设置为lab1

代码:

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();
}

}

0 个答案:

没有答案