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 の値は適切に設定されています。
ありがとう