Как переместить Jlabel с одной JPanel на другую

У меня много JPanel и один JLabel. Когда я нажимаю на один JPanel, я хочу, чтобы мой JLabel (содержит изображение) перемещался на этот JPanel. Как это можно сделать с помощью кода? Я кодирую в NetBeans.


person tziuka    schedule 09.06.2013    source источник
comment
Я начал делать что-то вроде игры в шахматы. Шахматные поля - это 64 панели JPanel. У меня есть JLabel (изображение), представляющее собой фрагменты. Во-первых, я хочу знать, как перемещать этот jlabel по JPanels, щелкая JPanel... (извините, плохой английский)   -  person tziuka    schedule 09.06.2013
comment
Не перемещайте ярлыки, просто измените их значки.   -  person Andrew Thompson    schedule 09.06.2013
comment
Я понимаю ваше мнение, но я хочу иметь только 32 этикетки (штук)   -  person tziuka    schedule 09.06.2013
comment
см. это, это может быть полезно для вас stackoverflow.com/questions/17008724/   -  person Avinash Nivangune    schedule 09.06.2013
comment
Я надеюсь, что этот пример сможет помочь вам в этом, хотя он использовал JButton вместо JPanel :-)   -  person nIcE cOw    schedule 09.06.2013


Ответы (1)


Предпосылка проста, но фактическое решение может зависеть от того, чего вы хотите достичь.

Поскольку компонент может одновременно существовать только в одном контейнере, вам нужно беспокоиться только о его добавлении в новый контейнер...

введите здесь описание изображения

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class LabelMover {

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

    public LabelMover() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BasePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class BasePane extends JPanel {

        private JLabel label;

        public BasePane() {
            setLayout(new GridLayout(2, 2));
            MouseHandler handler = new MouseHandler();
            for (int index = 0; index < 4; index++) {
                CellPane pane = new CellPane();
                pane.addMouseListener(handler);
                add(pane);
            }
            label = new JLabel(":)");
            label.setHorizontalAlignment(JLabel.CENTER);
            ((CellPane)getComponent(0)).add(label);
        }

        public class MouseHandler extends MouseAdapter {

            @Override
            public void mousePressed(MouseEvent e) {
                Component source = e.getComponent();
                if (!label.getParent().equals(source)) {
                    ((CellPane)source).add(label);
                    revalidate();
                    repaint();
                }
            }

        }

        public class CellPane extends JPanel {

            public CellPane() {
                setLayout(new BorderLayout());
                setBorder(new LineBorder(Color.GRAY));
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(50, 50);
            }

        }        
    }    
}
person MadProgrammer    schedule 09.06.2013