Poniższy przykładowy kod pokazuje, jak przeciągnąć kawałek szachownicy wokół szachownicy. Używa JLayeredPane zamiast tafli szkła, ale jestem pewien, że koncepcje byłyby takie same. To jest:
a) dodaje się szybę do okna głównego
b) zawiera taflę szkła w zakresie widzialnym
c) dodania składnika do szyby upewniając granice są ważne
d) stosowanie setLocation () animowanie przeciąganie komponentu
Edycja: dodano kod naprawić 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);
Przy zastosowaniu układu menedżerów nigdy nie używać setSize() lub setBounds() metody. W twoim przypadku wystarczy ustawić preferowany rozmiar na (0, 0), ponieważ jest to domyślny rozmiar wszystkich składników.
Działa po dodaniu etykiety do ramki, ponieważ domyślnym układem arkusza zawartości w ramce jest układ krawędzi, dlatego preferowany rozmiar etykiety jest ignorowany, a etykieta ma rozmiar ramki .
Jednak domyślnie JPanel używa FlowLayout, który respektuje preferowany rozmiar komponentu. Ponieważ preferowany rozmiar to 0, nie ma niczego do malowania.
Również szyba musi być widoczna, aby mogła zostać pomalowana.
Proponuję przeczytać Swing tutorial. Są tam informacje o tym, jak działają menedżerowie layoutów i o tym, jak działają tafle szkła, a każda sekcja ma przykłady robocze.
Edit: Przykładowy kod dodany poniżej:
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);
}
}
Czy próbowałeś ustawiania składnik AS na glasspane zamiast dodawania go do glasspane? – willcodejavaforfood
Ten komponent reprezentuje kafelek w grze słowno-obrazkowej, więc jest to tylko 37 * 37 i używa granic dla efektu. Nie rozumiem, jak mógłbym to przekształcić w szklaną taflę, ponieważ byłby bałagan z wymiarami płytki. –
Czy możemy zobaczyć kod? W szczególności sposób dodawania składnika do tafli szkła i ustawiania go jako widocznego. –