2013-06-09 3 views
0

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

+0

я начал делать что-то вроде шахмат игра. Шахматные квадраты - 64 JPanels. У меня есть JLabel (изображение), которые представляют фрагменты. Во-первых, я хочу знать, как переместить эту jlabel вокруг JPanels, нажав на JPanel ... (извините плохой английский) – tziuka

+0

Не перемещайте метки, просто меняйте их значки. –

+0

Я понимаю ваше мнение, но я хочу иметь только 32 ярлыка (штук) – tziuka

ответ

2

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

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

enter image description here

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

     }   
    }  
} 
Смежные вопросы