从jpanel添加/删除jlabels

时间:2014-02-12 20:56:30

标签: 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.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);
    }

}

当用户移动一块时,我希望更新方块。即目的地广场现在应该保持原点正方形jlabel。我试图用movePiece方法做到这一点。但是,这并没有创造我正在寻找的变化。我需要使用添加/删除方法吗?此外 - 每当我对董事会进行更新时,是否有必要致电frame.setVisible(true)

2 个答案:

答案 0 :(得分:3)

您可以使用Drag-and-Drop,也可以使用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;
   }

}

这使用了一个JLayeredPane,当用户选择一个片段时,它(一个JLabel)被从 登上JPanel并加入JLayeredPane的DRAG_LAYER,直到它通过 有效 位置发布。

请注意,此代码取自我之前的回答here。有关代码的更多详细信息,请查看答案。

答案 1 :(得分:2)

JFrame remove();方法怎么样?像这样使用它:

frame.remove(JLabelName);
相关问题