The top component will get a mouse click. How much JLabel will cover will depend on its size and on the JPanel layout manager. One way is to give the listener JLabel (as mentioned above), but another way to do this, as I described below, and perhaps not in the best way, it worked well for me:
1) JLayeredPane contains everything and has a MouseAdapter that is added as MouseListener and MouseMotionListener.
2) A JPanel called a “board” that uses GridLayout (8, 8) and is the exact size, since the JLayeredPane is added to the lower level layer of the laminated panel or, to be precise, JLayeredPane.DEFAULT_LAYER.
3) This JPanel contains 64 other small JPanel squares in the GridLayout (actually the squares extend from the JPanel), and each uses a GridBagLayout.
4) Chess pieces are JLabels and are held by JPanel squares.
5) In the mousePressed MouseAdapter method, I get Point, p that the mouse is located through e.getPoint (if e is the MouseEvent object passed to the method). Then I find out which square has this point by calling findComponentAt (p) on the JPanel board. Then I check if this square has a piece. If so, the piece is removed from the square and added directly to JLayeredPane JLayeredPane.DRAG_LAYER.
6) If a chess piece is held in JLayeredPane JLayeredPane.DRAG_LAYER, the mouseDragged MouseAdapter method will control the location of the fragment.
7) On mouseRelease, I will again find out which square contains the location of the mouse or point using the same procedure as above using findComponentAt (p), and if it is a valid square, I will remove the chess piece from the JLayeredPane JLayeredPane. DRAG_LAYER and put it in a square. If it is off the board or not a valid square, I return the chess piece to its original place.
Note that if the JPanel board does not completely fill the JLayeredPane, then its offset in the JLayeredPane should be used to correct the location of Point, p before calling findComponentAt (p), because the MouseAdapter will return points relative to the JLayeredPane, not the JPanel board.
For instance:
import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import javax.swing.*; public class Chess2 { private static void createAndShowUI() { JFrame frame = new JFrame("Chess 2"); frame.getContentPane().add(new Chess2Gui().getMainComponent()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } } class Chess2Gui { private static final int RANKS = 8; private static final int FILES = 8; private static final Color DARK_COLOR = new Color(0, 100, 0); private static final Color LIGHT_COLOR = new Color(200, 200, 200); private static final Color DARK_PIECE_COLOR = Color.black; private static final int SQR_WIDTH = 80; private static final int PIECE_WIDTH = 60; private static final Dimension SQR_SIZE = new Dimension(SQR_WIDTH, SQR_WIDTH); private JLayeredPane mainLayeredPane = new JLayeredPane(); private JPanel board = new JPanel(new GridLayout(RANKS, FILES)); private JPanelSquare[][] jPanelSquareGrid = new JPanelSquare[RANKS][FILES]; public Chess2Gui() { for (int rank = 0; rank < RANKS; rank++) { for (int file = 0; file < FILES; file++) { Color bkgd = DARK_COLOR; if (rank % 2 == file % 2) { bkgd = LIGHT_COLOR; } jPanelSquareGrid[rank][file] = new JPanelSquare(rank, file, bkgd); jPanelSquareGrid[rank][file].setPreferredSize(SQR_SIZE); board.add(jPanelSquareGrid[rank][file]); } } board.setSize(board.getPreferredSize()); board.setLocation(0, 0); mainLayeredPane.add(board, JLayeredPane.DEFAULT_LAYER); mainLayeredPane.setPreferredSize(board.getPreferredSize()); ImageIcon icon = new ImageIcon(ImageUtils2.createImage(PIECE_WIDTH, DARK_PIECE_COLOR)); JLabel chessPiece = new JLabel(icon, SwingConstants.CENTER); jPanelSquareGrid[1][3].add(chessPiece); MyMouseAdapter mouseAdapter = new MyMouseAdapter(); mainLayeredPane.addMouseListener(mouseAdapter); mainLayeredPane.addMouseMotionListener(mouseAdapter); } public JComponent getMainComponent() { return mainLayeredPane; } private class MyMouseAdapter extends MouseAdapter { private JLabel piece = null; private Point delta = null; private int oldRank = -1; private int oldFile = -1; @Override public void mousePressed(MouseEvent e) { Point p = e.getPoint(); Component c = board.getComponentAt(p); for (int rank = 0; rank < jPanelSquareGrid.length; rank++) { for (int file = 0; file < jPanelSquareGrid[rank].length; file++) { if (jPanelSquareGrid[rank][file] == c) { if (jPanelSquareGrid[rank][file].getChessPiece() != null) {