L'exemple de code ci-dessous montre comment faire glisser une pièce d'échecs autour d'un échiquier. Il utilise JLayeredPane au lieu d'un volet en verre, mais je suis sûr que les concepts seraient les mêmes. C'est:
a) ajouter la vitre dans le volet racine
b) faire la vitre visible
c) ajouter le composant à la vitre assurant que les limites sont valables
d) utiliser de setLocation () pour animer l'entraînement du composant
Edit: code ajouté pour fixer SSCCE
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);
Lorsque vous utilisez des gestionnaires de mise en page que vous ne jamais utiliser les setSize() ou setBounds(). Dans votre cas, il vous suffit de définir la taille préférée à (0, 0), car il s'agit de la taille par défaut de tous les composants. Il fonctionne lorsque vous ajoutez l'étiquette au cadre car le gestionnaire de disposition par défaut pour le volet de contenu du cadre est une disposition de bordure. Par conséquent, la taille préférée de l'étiquette est ignorée et l'étiquette est la taille de l'image. .
Cependant, par défaut, un JPanel utilise un FlowLayout qui respecte la taille préférée du composant. Puisque la taille préférée est 0, il n'y a rien à peindre.
De plus, la vitre doit être visible pour pouvoir être peinte.
Je vous suggère de lire le Swing tutorial. Il y a une section sur le fonctionnement des gestionnaires de disposition et sur le fonctionnement des vitres et chaque section a des exemples pratiques.
Edit: Exemple de code ajouté ci-dessous:
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 < 8; i++)
{
for (int j = 0; j < 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);
}
}
Avez-vous essayé de placer votre appareil comme GlassPane au lieu d'ajouter à la GlassPane? – willcodejavaforfood
Ce composant représente une tuile dans un jeu de mots, donc il est seulement 37 * 37 et utilise des bordures pour l'effet. Je ne vois pas comment je pourrais transformer cela en une vitre car cela nuirait aux dimensions de la tuile. –
Pouvons-nous voir du code? Spécifiquement comment vous ajoutez le composant à la vitre et le placez visible. –