0

jlabels を上部に配置した jpanels のグリッドを設定して、チェス ゲームの gui を作成しています (作品の画像)。各正方形 (jpanel) に空の jlabel を設定し、可視性を false に設定してボードをセットアップしました。次に、各 jpanels を調べて、jlabel 画像を自分の作品の 1 つに対応する画像に設定します。_board[8][8] という変数があり、そのスポットが占有されているかどうか、また誰によって占有されているかがわかります。これは、元のボードを作成する方法です。

編集:

私は実際にこれをかなり変更しました。そのため、毎回画像をリロードする必要はありません。

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());

    }

これにより、最初のボードが正常にロードされますが、特定のコンポーネントを取得できないようです。ピースの 1 つをクリックすると、その四角が点灯します。緑色のアウトラインを取得する唯一の正方形は、左上 (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;
        }

この行に問題があると思います: JPanel curSquare = (JPanel)theBoard.getComponentAt(gameX, gameY);

ただし、gameX と gameY の値は適切に設定されています。

ありがとう

4

1 に答える 1

1

各パネルにラベルを追加する行が不足していると思います。「//初期正方形の設定」中:

curLabel.setVisible(false);

する必要があります:

curLabel.setVisible(false);
aChessSquare.add(curLabel);
于 2013-02-07T10:10:08.990 に答える