Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>The example code below shows how to drag a chess piece around a chess board. It uses JLayeredPane instead of a glass pane, but I'm sure the concepts would be the same. That is:</p> <p>a) add the glass pane to the root pane<br> b) make the glass pane visible<br> c) add the component to the glass pane making sure the bounds are valid<br> d) use setLocation() to animate the dragging of the component </p> <p>Edit: added code to fix SSCCE </p> <pre><code>JLabel l = new JLabel(); l.setText("Hello"); l.setBorder(new LineBorder(Color.BLACK, 1)); // l.setPreferredSize(l.getSize()); // l.setBounds(10, 10, 50, 20); ((JPanel)mf.getGlassPane()).add(l); mf.setVisible(true); mf.getGlassPane().setVisible(true); </code></pre> <p>When using layout managers you never use the setSize() or setBounds() methods. In your case you just set the preferred size to (0, 0) since this is the default size of all components. </p> <p>It works when you add the label to the frame because the default layout manger for the content pane of the frame is a border layout, therefore the preferred size of the label is ignored and the label is made the size of the frame. </p> <p>However, by default a JPanel uses a FlowLayout which does respect the preferred size of the component. Since the preferred size is 0, there is nothing to paint.</p> <p>Also, the glass pane needs to made visible in order for it to be painted.</p> <p>I suggest you read the <a href="http://java.sun.com/docs/books/tutorial/uiswing/TOC.html" rel="noreferrer">Swing tutorial</a>. There are section on how layout managers work and on how glass panes work and each section has working examples.</p> <p>Edit: Example code added below:</p> <pre><code>import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; public class ChessBoard extends JFrame implements MouseListener, MouseMotionListener { JLayeredPane layeredPane; JPanel chessBoard; JLabel chessPiece; int xAdjustment; int yAdjustment; public ChessBoard() { Dimension boardSize = new Dimension(600, 600); // Use a Layered Pane for this this application layeredPane = new JLayeredPane(); layeredPane.setPreferredSize( boardSize ); layeredPane.addMouseListener( this ); layeredPane.addMouseMotionListener( this ); getContentPane().add(layeredPane); // Add a chess board to the Layered Pane chessBoard = new JPanel(); chessBoard.setLayout( new GridLayout(8, 8) ); chessBoard.setPreferredSize( boardSize ); chessBoard.setBounds(0, 0, boardSize.width, boardSize.height); layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER); // Build the Chess Board squares for (int i = 0; i &lt; 8; i++) { for (int j = 0; j &lt; 8; j++) { JPanel square = new JPanel( new BorderLayout() ); square.setBackground( (i + j) % 2 == 0 ? Color.red : Color.white ); chessBoard.add( square ); } } // Add a few pieces to the board ImageIcon duke = new ImageIcon("dukewavered.gif"); // add an image here JLabel piece = new JLabel( duke ); JPanel panel = (JPanel)chessBoard.getComponent( 0 ); panel.add( piece ); piece = new JLabel( duke ); panel = (JPanel)chessBoard.getComponent( 15 ); panel.add( piece ); } /* ** Add the selected chess piece to the dragging layer so it can be moved */ public void mousePressed(MouseEvent e) { chessPiece = null; Component c = chessBoard.findComponentAt(e.getX(), e.getY()); if (c instanceof JPanel) return; Point parentLocation = c.getParent().getLocation(); xAdjustment = parentLocation.x - e.getX(); yAdjustment = parentLocation.y - e.getY(); chessPiece = (JLabel)c; chessPiece.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment); layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER); layeredPane.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); } /* ** Move the chess piece around */ public void mouseDragged(MouseEvent me) { if (chessPiece == null) return; // The drag location should be within the bounds of the chess board int x = me.getX() + xAdjustment; int xMax = layeredPane.getWidth() - chessPiece.getWidth(); x = Math.min(x, xMax); x = Math.max(x, 0); int y = me.getY() + yAdjustment; int yMax = layeredPane.getHeight() - chessPiece.getHeight(); y = Math.min(y, yMax); y = Math.max(y, 0); chessPiece.setLocation(x, y); } /* ** Drop the chess piece back onto the chess board */ public void mouseReleased(MouseEvent e) { layeredPane.setCursor(null); if (chessPiece == null) return; // Make sure the chess piece is no longer painted on the layered pane chessPiece.setVisible(false); layeredPane.remove(chessPiece); chessPiece.setVisible(true); // The drop location should be within the bounds of the chess board int xMax = layeredPane.getWidth() - chessPiece.getWidth(); int x = Math.min(e.getX(), xMax); x = Math.max(x, 0); int yMax = layeredPane.getHeight() - chessPiece.getHeight(); int y = Math.min(e.getY(), yMax); y = Math.max(y, 0); Component c = chessBoard.findComponentAt(x, y); if (c instanceof JLabel) { Container parent = c.getParent(); parent.remove(0); parent.add( chessPiece ); parent.validate(); } else { Container parent = (Container)c; parent.add( chessPiece ); parent.validate(); } } public void mouseClicked(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public static void main(String[] args) { JFrame frame = new ChessBoard(); frame.setDefaultCloseOperation( DISPOSE_ON_CLOSE ); frame.setResizable( false ); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload