简体   繁体   中英

Drawing and deleting jlabels from a jpanel

I am making a chess game gui by setting up a grid of jpanels with jlabels on top (the piece images). I set up the board with each square (jpanel) having an empty jlabel w/ visibility set to false. I then go through each of the jpanels and set the jlabel picture to an image corresponding to one of my pieces. I know whether or not to draw a piece because I have a variable _board[8][8] that tells me if that spot is occupied and by whom. This is how I create the original board:

EDIT:

I actually changed this up quite a bit, that way I don't have to reload images each time:

public ChessGameGUI(Square[][] board) throws IOException 
    {
        Dimension size = new Dimension(500, 400);
        Dimension boardSize = new Dimension(400, 400);

        layeredPane = new JLayeredPane();
        getContentPane().add(layeredPane);
        layeredPane.setPreferredSize(size);

        theBoard = new JPanel();
        layeredPane.add(theBoard, JLayeredPane.DEFAULT_LAYER);
        layeredPane.addMouseListener(this);

        GridLayout chessBoardLayout = new GridLayout(8,8);
        theBoard.setLayout(chessBoardLayout);
        theBoard.setPreferredSize(boardSize);
        theBoard.setBounds(0, 0, boardSize.width, boardSize.height);

        boolean drawWhite = true;

        // setup initial squares
        for(int y = 0; y < 8; y++)
        {
            for(int x = 0; x < 8; x++)
            {
                BorderLayout squareBorder = new BorderLayout();
                JPanel aChessSquare = new JPanel(squareBorder);

                if(drawWhite) aChessSquare.setBackground(Color.WHITE);
                else aChessSquare.setBackground(Color.GRAY);

                // load initial images
                if(board[x][y]._isOccupied)
                {
                    BufferedImage logo = null;

                    try{
                        // load the image
                        String path = findPieceImagePath(board, x, y);
                        logo = ImageIO.read(new File(path));
                        ImageIcon pieceImage = new ImageIcon(logo);

                        JLabel pieceJLabel = new JLabel();
                        pieceJLabel.setIcon(pieceImage); // new
                        pieceJLabel.setVisible(true); // new

                        aChessSquare.add(pieceJLabel);
                    } 
                    catch (IOException e)
                    { 
                        e.printStackTrace(); 
                    } // end try catch
                }// end if
                else
                {
                    JLabel pieceJLabel = new JLabel();
                    pieceJLabel.setVisible(false);
                    aChessSquare.add(pieceJLabel);
                }

                theBoard.add(aChessSquare);

                // alternate background colors
                if(x == 7);
                else drawWhite = !drawWhite;
            }
        }

        System.out.println("the number of components = " + theBoard.getComponentCount());

    }

This loads the initial board just fine, however I can't seem to get a specific component. When I click on one of the pieces, that square should light up. The only square that ever gets the green outline is the one in the top left (0, 0).

public void mousePressed(MouseEvent e) 
    {
        System.out.println("mouse press x = " + e.getX() + " y = " + e.getY());

        // find which piece on the board is being clicked
        int gameX, gameY;
        gameX = e.getX() / 50;
        gameY = e.getY() / 50;

        System.out.println("gameX = " + gameX + " gameY = " + gameY);

        // out of bounds
        if(gameX < 0 || gameY < 0) return;

        // true if selected a piece on this team
        if(myGame._board[gameX][gameY]._isOccupied && !_pieceSelected && myGame._board[gameX][gameY]._team == myGame._turn) 
        {
            System.out.println("selected new piece");
            JPanel curSquare = (JPanel)theBoard.getComponentAt(gameX, gameY);
            curSquare.setBorder(BorderFactory.createLineBorder(Color.green));
            _pieceSelected = !_pieceSelected;



            return;
        }

I guess I am having problems with this line: JPanel curSquare = (JPanel)theBoard.getComponentAt(gameX, gameY);

however, the gameX and gameY values are being set properly.

Thanks

I think you are missing a line to add the label to each panel. During "// setup initial squares":

curLabel.setVisible(false);

Should be:

curLabel.setVisible(false);
aChessSquare.add(curLabel);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM