Java 从jpanel添加/删除JLabel
这是我的密码:Java 从jpanel添加/删除JLabel,java,swing,Java,Swing,这是我的密码: public class GUI { JFrame frame; JPanel squares[][]; public void movePiece(int oriX, int oriY, int destX, int destY) { squares[destY][destX] = squares[oriY][oriX]; squares[oriY][oriX] = null; frame.set
public class GUI
{
JFrame frame;
JPanel squares[][];
public void movePiece(int oriX, int oriY, int destX, int destY)
{
squares[destY][destX] = squares[oriY][oriX];
squares[oriY][oriX] = null;
frame.setVisible(true);
}
/* Constructor credited to stackoverflow user ranzy
http://stackoverflow.com/questions/2535417/chess-board-in-java */
public GUI()
{
frame = new JFrame("Chess");
squares = new JPanel[8][8];
frame.setSize(500, 500);
frame.setLayout(new GridLayout(8, 8));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
squares[i][j] = new JPanel();
if ((i + j) % 2 == 0) {
squares[i][j].setBackground(Color.white);
} else {
squares[i][j].setBackground(Color.orange);
}
frame.add(squares[i][j]);
}
}
ImageIcon pawnW = new ImageIcon(getClass().getResource("pawnW.png"));
ImageIcon knightW = new ImageIcon(getClass().getResource("knightW.png"));
ImageIcon bishopW = new ImageIcon(getClass().getResource("bishopW.png"));
ImageIcon rookW = new ImageIcon(getClass().getResource("rookW.png"));
ImageIcon queenW = new ImageIcon(getClass().getResource("queenW.png"));
ImageIcon kingW = new ImageIcon(getClass().getResource("kingW.png"));
ImageIcon pawnB = new ImageIcon(getClass().getResource("pawnB.png"));
ImageIcon knightB = new ImageIcon(getClass().getResource("knightB.png"));
ImageIcon bishopB = new ImageIcon(getClass().getResource("bishopB.png"));
ImageIcon rookB = new ImageIcon(getClass().getResource("rookB.png"));
ImageIcon queenB = new ImageIcon(getClass().getResource("queenB.png"));
ImageIcon kingB = new ImageIcon(getClass().getResource("kingB.png"));
squares[0][0].add(new JLabel(rookB));
squares[0][1].add(new JLabel(knightB));
squares[0][2].add(new JLabel(bishopB));
squares[0][3].add(new JLabel(queenB));
squares[0][4].add(new JLabel(kingB));
squares[0][5].add(new JLabel(bishopB));
squares[0][6].add(new JLabel(knightB));
squares[0][7].add(new JLabel(rookB));
squares[7][0].add(new JLabel(rookW));
squares[7][1].add(new JLabel(knightW));
squares[7][2].add(new JLabel(bishopW));
squares[7][3].add(new JLabel(queenW));
squares[7][4].add(new JLabel(kingW));
squares[7][5].add(new JLabel(bishopW));
squares[7][6].add(new JLabel(knightW));
squares[7][7].add(new JLabel(rookW));
for (int i = 0; i < 8; i++)
{
squares[1][i].add(new JLabel(pawnB));
squares[6][i].add(new JLabel(pawnW));
}
frame.setVisible(true);
}
}
公共类GUI
{
JFrame框架;
JPanel正方形[];
公共无效移动件(内部oriX、内部Ory、内部destX、内部destY)
{
正方形[destY][destX]=正方形[oriY][oriX];
平方[oriY][oriX]=零;
frame.setVisible(true);
}
/*由stackoverflow用户ranzy创建的构造函数
http://stackoverflow.com/questions/2535417/chess-board-in-java */
公共图形用户界面()
{
框架=新的JFrame(“国际象棋”);
正方形=新的JPanel[8][8];
框架。设置尺寸(500500);
frame.setLayout(新的GridLayout(8,8));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
对于(int i=0;i<8;i++){
对于(int j=0;j<8;j++){
正方形[i][j]=新的JPanel();
如果((i+j)%2==0){
方格[i][j].退根地(颜色.白色);
}否则{
方格[i][j].退根(颜色.橙色);
}
加上(方格[i][j]);
}
}
ImageIcon pawnW=新的ImageIcon(getClass().getResource(“pawnW.png”);
ImageIcon knightW=新的ImageIcon(getClass().getResource(“knightW.png”);
ImageIcon bishopW=新的ImageIcon(getClass().getResource(“bishopW.png”);
ImageIcon rookW=新的ImageIcon(getClass().getResource(“rookW.png”);
ImageIcon queenW=新的ImageIcon(getClass().getResource(“queenW.png”);
ImageIcon kingW=新的ImageIcon(getClass().getResource(“kingW.png”);
ImageIcon pawnB=新的ImageIcon(getClass().getResource(“pawnB.png”);
ImageIcon knightB=新的ImageIcon(getClass().getResource(“knightB.png”);
ImageIcon bishopB=新的ImageIcon(getClass().getResource(“bishopB.png”);
ImageIcon rookB=新的ImageIcon(getClass().getResource(“rookB.png”);
ImageIcon queenB=新的ImageIcon(getClass().getResource(“queenB.png”);
ImageIcon kingB=新的ImageIcon(getClass().getResource(“kingB.png”);
正方形[0][0]。添加(新JLabel(rookB));
正方形[0][1]。添加(新JLabel(knightB));
正方形[0][2]。添加(新JLabel(bishopB));
正方形[0][3]。添加(新JLabel(queenB));
正方形[0][4]。添加(新JLabel(kingB));
正方形[0][5]。添加(新JLabel(bishopB));
正方形[0][6]。添加(新JLabel(奈特b));
正方形[0][7]。添加(新JLabel(rookB));
正方形[7][0]。添加(新JLabel(rooww));
正方形[7][1]。添加(新JLabel(knightW));
正方形[7][2]。添加(新的JLabel(主教));
正方形[7][3]。添加(新JLabel(queenW));
正方形[7][4]。添加(新JLabel(kingW));
正方形[7][5]。添加(新的JLabel(主教));
正方形[7][6]。添加(新JLabel(knightW));
正方形[7][7]。添加(新JLabel(rooww));
对于(int i=0;i<8;i++)
{
方格[1][i]。添加(新JLabel(pawnB));
方格[6][i]。添加(新JLabel(pawnW));
}
frame.setVisible(true);
}
}
当用户移动一个工件时,我希望更新正方形。也就是说,目标方块现在应该包含原点方块jlabel。我尝试用我的
movePiece
方法来实现这一点。但是,这并不是我想要的改变。是否需要使用添加/删除方法?另外-在我对线路板进行更新时,是否需要调用frame.setVisible(true)
代码>方法?像这样使用它:
frame.remove(JLabelName);
JFrame
remove()怎么样代码>方法?像这样使用它:
frame.remove(JLabelName);
您可以使用拖放,也可以使用Mouselistener和MouseMotionListener。后者的一个例子可以在我的代码中看到:
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) {
// the jPanelSquares are derived from JPanel but have a
// few of their own methods
piece = jPanelSquareGrid[rank][file].getChessPiece();
jPanelSquareGrid[rank][file].remove(piece);
oldRank = rank;
oldFile = file;
mainLayeredPane.add(piece, JLayeredPane.DRAG_LAYER);
int x = p.x - PIECE_WIDTH / 2;
int y = p.y - PIECE_WIDTH / 2;
piece.setLocation(x, y);
delta = new Point(p.x - x, p.y - y);
board.revalidate();
mainLayeredPane.repaint();
return;
}
}
}
}
oldFile = -1;
oldRank = -1;
}
@Override
public void mouseDragged(MouseEvent e) {
if (piece != null) {
Point p = e.getPoint();
int x = p.x - delta.x;
int y = p.y - delta.y;
piece.setLocation(x, y);
mainLayeredPane.revalidate();
mainLayeredPane.repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (piece != null) {
JPanelSquare sqr = (JPanelSquare) board.getComponentAt(e.getPoint());
mainLayeredPane.remove(piece);
if (sqr == null || !validMove(sqr)) {
jPanelSquareGrid[oldRank][oldFile].add(piece);
} else {
sqr.add(piece);
}
piece = null;
delta = null;
oldRank = -1;
oldFile = -1;
board.revalidate();
mainLayeredPane.repaint();
}
}
// just a pawn's moves
private boolean validMove(JPanelSquare sqr) {
int rank = sqr.getRank();
int file = sqr.getFile();
if (file != oldFile) {
return false;
}
if (oldRank == 1 && (rank != 2 && rank != 3)) {
return false;
}
if (oldRank != 1 && rank != oldRank + 1) {
return false;
}
return true;
}
}
}
@SuppressWarnings("serial")
class JPanelSquare extends JPanel {
private int rank;
private int file;
private JLabel chessPiece = null;
public JPanelSquare(int rank, int file, Color bkgrnd) {
this.rank = rank;
this.file = file;
setBackground(bkgrnd);
setLayout(new GridBagLayout());
}
public int getRank() {
return rank;
}
public int getFile() {
return file;
}
@Override
public Component add(Component c) {
chessPiece = (JLabel) c;
return super.add(c);
}
@Override
public void remove(Component comp) {
chessPiece = null;
super.remove(comp);
}
public JLabel getChessPiece() {
return chessPiece;
}
}
class ImageUtils2 {
public static BufferedImage createImage(int size, Color color) {
BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
g2.setColor(color);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.fillOval(size / 3, 0, size / 3, size / 3);
g2.fillOval(size / 4, size / 4, size / 2, 2 * size / 3);
g2.fillOval(size / 6, 2 * size / 3, 2 * size / 3, size / 2);
g2.dispose();
return img;
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.awt.image.buffereImage;
导入javax.swing.*;
公共类棋子2{
私有静态void createAndShowUI(){
JFrame=新JFrame(“国际象棋2”);
frame.getContentPane().add(新Chess2Gui().getMainComponent());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
invokeLater(new Runnable()){
公开募捐{
createAndShowUI();
}
});
}
}
类棋盘2GUI{
私有静态最终整数秩=8;
私有静态最终int文件=8;
私有静态最终颜色暗_颜色=新颜色(0,100,0);
专用静态最终颜色灯颜色=新颜色(200200200);
私有静态最终颜色暗\u块\u颜色=Color.black;
专用静态最终整数SQR_宽度=80;
专用静态最终整块宽度=60;
专用静态最终尺寸SQR_尺寸=新尺寸(SQR_宽度、SQR_宽度);
private JLayeredPane main layeredpane=新JLayeredPane();
私有JPanel板=新JPanel(新网格布局(等级、文件));
私有JPanelSquare[][]jPanelSquareGrid=新JPanelSquare[等级][文件];
公共Chess2Gui(){
for(int-rank=0;rank