JPanel
には、レイアウトマネージャーとしてGridLayout(8,8)
を使用した単純なチェスボードがあります。
フィールドの列名と行番号のパネルを追加しようとしています。
今、レイアウトマネージャーとしてBorderLayout
を使用して別のパネルを作成し、このパネルでボードを_BorderLayout.CENTER
_に追加します。ボード自体の横に、_BorderLayout.SOUTH
_にGridLayout(0,8)
を含むパネルと、_BorderLayout.WEST
_にGridLayout(8,0)
を含むパネルを追加しました。左のJPanelの行数はボードの行数と一致するため、行番号はボードの隣に完全に配置されますが、列名(A、B、C、D、E、F、G、H)は_BorderLayout.WEST
_のJPanelのため、ボードの下のJPanelは正しく配置されません。
フィールド番号/名前を表示するためのサイドパネルを備えた適切なチェス盤を作成するにはどうすればよいですか?
南パネルのレイアウトをGridLayout(0,9)
に設定して最初のフィールドを空にしようとしましたが、左パネルの幅がボードの各フィールドと等しくないため、回避策としては適していません。
ここに表示されるGUIは改善され、 堅牢でサイズ変更可能なSwing Chess GUIの作成 に移動しました。
アニメーションGIFはここに残し(かわいいから)、元のストリップコード(わずか125コード行のうち、他のスレッドで見られる最終コードは218 LOC)を残します。
import Java.awt.*;
import Java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.*;
public class ChessBoardWithColumnsAndRows {
private final JPanel gui = new JPanel(new BorderLayout(3, 3));
private JButton[][] chessBoardSquares = new JButton[8][8];
private JPanel chessBoard;
private final JLabel message = new JLabel(
"Chess Champ is ready to play!");
private static final String COLS = "ABCDEFGH";
ChessBoardWithColumnsAndRows() {
initializeGui();
}
public final void initializeGui() {
// set up the main GUI
gui.setBorder(new EmptyBorder(5, 5, 5, 5));
JToolBar tools = new JToolBar();
tools.setFloatable(false);
gui.add(tools, BorderLayout.PAGE_START);
tools.add(new JButton("New")); // TODO - add functionality!
tools.add(new JButton("Save")); // TODO - add functionality!
tools.add(new JButton("Restore")); // TODO - add functionality!
tools.addSeparator();
tools.add(new JButton("Resign")); // TODO - add functionality!
tools.addSeparator();
tools.add(message);
gui.add(new JLabel("?"), BorderLayout.LINE_START);
chessBoard = new JPanel(new GridLayout(0, 9));
chessBoard.setBorder(new LineBorder(Color.BLACK));
gui.add(chessBoard);
// create the chess board squares
Insets buttonMargin = new Insets(0,0,0,0);
for (int ii = 0; ii < chessBoardSquares.length; ii++) {
for (int jj = 0; jj < chessBoardSquares[ii].length; jj++) {
JButton b = new JButton();
b.setMargin(buttonMargin);
// our chess pieces are 64x64 px in size, so we'll
// 'fill this in' using a transparent icon..
ImageIcon icon = new ImageIcon(
new BufferedImage(64, 64, BufferedImage.TYPE_INT_ARGB));
b.setIcon(icon);
if ((jj % 2 == 1 && ii % 2 == 1)
//) {
|| (jj % 2 == 0 && ii % 2 == 0)) {
b.setBackground(Color.WHITE);
} else {
b.setBackground(Color.BLACK);
}
chessBoardSquares[jj][ii] = b;
}
}
//fill the chess board
chessBoard.add(new JLabel(""));
// fill the top row
for (int ii = 0; ii < 8; ii++) {
chessBoard.add(
new JLabel(COLS.substring(ii, ii + 1),
SwingConstants.CENTER));
}
// fill the black non-pawn piece row
for (int ii = 0; ii < 8; ii++) {
for (int jj = 0; jj < 8; jj++) {
switch (jj) {
case 0:
chessBoard.add(new JLabel("" + (ii + 1),
SwingConstants.CENTER));
default:
chessBoard.add(chessBoardSquares[jj][ii]);
}
}
}
}
public final JComponent getChessBoard() {
return chessBoard;
}
public final JComponent getGui() {
return gui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
ChessBoardWithColumnsAndRows cb =
new ChessBoardWithColumnsAndRows();
JFrame f = new JFrame("ChessChamp");
f.add(cb.getGui());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
// ensures the frame is the minimum size it needs to be
// in order display the components within it
f.pack();
// ensures the minimum size is enforced.
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
GridLayout
によって提供されます。グリッドレイアウトの最初のセルは、テキストのないラベルです。ActionListener
を追加すると、キーボードイベントとマウスイベントの両方に応答します。?
GUIの左側にある領域は、その領域が「将来の使用のために予約されている」ことを意味します。キャプチャされたピースのリスト、ポーンをプロモートするときにピースを選択するためのセレクター、ゲーム統計などを表示するために使用できます.