Olhei o jogo que vc tem como objetivo final, e pra minha surpresa, não tem nada pra arrastar la hehe mas tudo bem …
O atributo painelInicial ficaria na classe que movimenta o componente, e vc poderia referenciar ele no mousePressed
alterei o exemplo mais uma vez, agora ele só deixa trocar de painel se formar a palavra ABC, caso contrário ele volta para o panel
que ele saiu, da uma testada ai …
O JFrame …
public class JFMoveComp extends JFrame {
private JLabel labelA;
private JLabel labelB;
private JLabel labelC;
private JPanel panel1;
private JPanel panel2;
private JPanel panel3;
private JPanel panel4;
public JFMoveComp() {
initGUI();
}
private void initGUI() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
setSize(714, 500);
setLocationRelativeTo(null);
getContentPane().setBackground(Color.black);
{
panel1 = new JPanel();
getContentPane().add(panel1);
panel1.setLayout(null);
panel1.setBounds(22, 20, 263, 174);
panel1.setBorder(new LineBorder(Color.black));
}
{
panel2 = new JPanel();
getContentPane().add(panel2);
panel2.setBorder(new LineBorder(Color.black));
panel2.setLayout(null);
panel2.setBounds(41, 217, 263, 237);
}
{
panel3 = new JPanel();
getContentPane().add(panel3);
panel3.setBorder(new LineBorder(Color.black));
panel3.setLayout(null);
panel3.setBounds(393, 43, 263, 174);
}
{
panel4 = new JPanel();
getContentPane().add(panel4);
panel4.setBorder(new LineBorder(Color.black));
panel4.setLayout(null);
panel4.setBounds(354, 261, 203, 130);
}
{
labelA = new JLabel("A");
panel1.add(labelA);
labelA.setHorizontalAlignment(JLabel.CENTER);
labelA.setOpaque(true);
labelA.setBackground(Color.blue);
labelA.setForeground(Color.white);
labelA.setBounds(15, 15, 50, 49);
MoveComponentListener l = new MoveComponentListener(panel1,panel2, panel3, panel4);
labelA.addMouseListener(l);
labelA.addMouseMotionListener(l);
}
{
labelB = new JLabel("B");
panel2.add(labelB);
labelB.setHorizontalAlignment(JLabel.CENTER);
labelB.setOpaque(true);
labelB.setBackground(Color.red);
labelB.setForeground(Color.white);
labelB.setBounds(15, 15, 50, 49);
MoveComponentListener l = new MoveComponentListener(panel1,panel2, panel3, panel4);
labelB.addMouseListener(l);
labelB.addMouseMotionListener(l);
}
{
labelC = new JLabel("C");
panel3.add(labelC);
labelC.setHorizontalAlignment(JLabel.CENTER);
labelC.setOpaque(true);
labelC.setBackground(Color.green);
labelC.setForeground(Color.white);
labelC.setBounds(15, 15, 50, 49);
MoveComponentListener l = new MoveComponentListener(panel1,panel2, panel3, panel4);
labelC.addMouseListener(l);
labelC.addMouseMotionListener(l);
}
}
public static void main(String[] args) {
new JFMoveComp().setVisible(true);
}
}
e o listener
public class MoveComponentListener extends MouseAdapter{
private int baseX = -1;
private int baseY = -1;
private Rectangle2D r2d;
private JPanel[] panels;
private JPanel panelIni; //Painel Inicial(que o componente volta caso esteja no lugar errado)
private Point posIni; // posição que ele volta
public MoveComponentListener(JPanel... panels) {
this.panels = panels; //O LISTENER PRECISA CONHECER OS PAINEIS
this.r2d = new Rectangle2D.Double(); //RECTANGLE2D QUE REPRESENTA A POSIÇÃO DO COMPONENTE FORA DO SEU PAINEL
}
@Override
public void mouseDragged(MouseEvent e) {
if ((baseX != -1) && (baseY != -1)) {
Component c = e.getComponent();
Container p = c.getParent(); //O PAINEL QUE O COMPONENTE ESTA
int x = c.getX() + e.getX() - baseX;
int y = c.getY() + e.getY() - baseY;
c.setLocation(x, y);
c.repaint();
//VERIFICA SE O COMPONENTE SAIU FORA DO SEU PAINEL
if(c.getX() > p.getWidth() || c.getY() > p.getHeight() || c.getX()+c.getWidth()<0 || c.getY()+c.getHeight() < 0)
mudaPanel(c);
}
}
@Override
public void mousePressed(MouseEvent e) {
baseX = e.getX();
baseY = e.getY();
if(panelIni == null)
panelIni = (JPanel)e.getComponent().getParent(); //salva o painel inicial
if(posIni == null)
posIni = e.getComponent().getLocation(); //salva a posição inicial
}
@Override
public void mouseReleased(MouseEvent e) {
baseX = -1;
baseY = -1;
//NÃO DEIXA SOLTAR O COMPONENTE FORA DE UM PAINEL
Component c = e.getComponent();
Container p = c.getParent();
int x = c.getX();
int y = c.getY();
if(c.getX()+c.getWidth() > p.getWidth() )
x = p.getWidth() - c.getWidth();
if(c.getY()+c.getHeight() > p.getHeight() )
y = p.getHeight() - c.getHeight();
if(c.getX() < 0)
x = 0;
if(c.getY() < 0)
y = 0;
c.setLocation(x, y);
if( p!=panelIni && !verificaPalavra(p) ) { //verifica se não esta movendo dentro do próprio panel dele
//caso a verificação seja falsa, volta para o panel inicial e para a sua posição
p.remove(c);
panelIni.add(c);
c.setLocation(posIni);
p.repaint();
} else { //senão salva o seu novo painel como sendo o inicial, e tambem para a posição
panelIni = (JPanel)p;
posIni = c.getLocation();
}
}
private boolean verificaPalavra(Container p) {
String palavra = "";
for(Component c:p.getComponents())//percorre os componentes do painel que ele esta
palavra += ((JLabel)c).getText(); // forma a palavra com o texto dos componentes
System.out.println(palavra+"\n");
return (palavra.equals("A")||palavra.equals("AB")||palavra.equals("ABC")); //verifica se é uma palavra válida (boolean)
}
private void mudaPanel(Component c) {
Container atual = c.getParent();
//RECTANGLE2D (POSIÇÃO) DO COMPONENTE FORA DO SEU PAINEL
r2d.setRect(atual.getX()+c.getX(), atual.getY()+c.getY(), c.getWidth(),c.getHeight());
for(JPanel novo:panels){ //PERCORRE OS PAINEIS QUE ELE CONHECE
if(novo!=atual && r2d.intersects(novo.getBounds())){ //VERIFICA SE O COMPONENTE ESTA DENTRO DE OUTRO PAINEL
atual.remove(c); //REMOVE ELE DO SEU PAINEL ATUAL
novo.add(c); //E INSERE DENTRO DO NOVO PAINEL
c.setLocation( //REPOSICIONA O COMPONENTE DENTRO DO SEU NOVO PAINEL
(int)(r2d.getX()-novo.getX()),
(int)(r2d.getY()-novo.getY())
);
break;
}
}
}
}
se vc é iniciante em java, e quer aprender o básico sobre orientação a objetos, estude a apostila fj-11 da Caelum, é a melhor que eu conheço …
vc pode baixar gratuitamente aqui:
http://www.caelum.com.br/curso/fj-11-java-orientacao-objetos/