我在用Swing下国际象棋
对于电路板(JPanel),我使用new GridLayout(8, 8)
,然后我添加64个方块(JPanel)。
在每个Square中,我有一个JLabel用于代数符号(A8,A7...),这个标签位置很好。
这个问题来自于包含片段图像的另一个JLabel,这个JLabel没有垂直居中,我如何才能将这个JLabel居中在Square中?
下面是Square的代码:
package org.victorpiles.escacs.client.gui;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* @author Víctor Piles
*/
public class Square extends JPanel {
private static final String PIECE_ICON_PATH = "client/src/main/resources/pieces/";
private static final Color LIGHT_COLOR = new Color(118, 150, 86, 255);
private static final Color DARK_COLOR = new Color(238, 238, 210, 255);
private final int position;
public Square(int position) {
super(new BorderLayout());
setAlgebraicNotationLabel(position);
this.position = position;
setBackground(getSquareColor(position));
}
private void setAlgebraicNotationLabel(int position) {
JLabel squarePosition = new JLabel(getAlgebraicNotation(position));
squarePosition.setBorder(new EmptyBorder(5, 5, 5, 5));
add(squarePosition, BorderLayout.PAGE_END);
}
/**
* Calcula el color adequat per a la casella, basant-se en la seua posició.
*
* @param position La posició de la casella.
*
* @return El color de la casella: {@link #LIGHT_COLOR clar} o {@link #DARK_COLOR fosc}.
*/
private Color getSquareColor(int position) {
int row = position / 8;
int column = position % 8;
return (row + column) % 2 != 0 ? LIGHT_COLOR : DARK_COLOR;
}
/**
* Calcula la notació algebraica per a la casella, basant-se en la seua posició.
*
* @param position La posició de la casella.
*
* @return La notació algebraica per a la casella.
*/
private String getAlgebraicNotation(int position) {
int row = 8 - (position / 8);
char column = (char) ('a' + (position % 8));
return ("" + column + row).toUpperCase();
}
public void updatePiece(char piece) {
removeAll();
BufferedImage pieceImage;
if (piece == '-') {
return;
}
String fileName = PIECE_ICON_PATH + piece + ".png";
try {
pieceImage = ImageIO.read(new File(fileName));
System.out.println(position + " -> " + pieceImage.getHeight());
} catch (IOException e) {
// TODO: 20/3/23 Manejar excepció
throw new RuntimeException(e);
}
/* Actualitza la casella */
setAlgebraicNotationLabel(position);
add(new JLabel(new ImageIcon(pieceImage)));
validate();
}
}
2条答案
按热度按时间but5z9lq1#
图像未垂直居中,因为另一个JLabel占据了部分空间
这就是布局管理器的工作方式。组件在2D空间中被分配位置。因此,如果图像是60 X 60,则注解标签将显示在图像下方,而不是图像上方。
如果您希望注解标签显示在图像标签的顶部,则需要将注解标签添加到图像标签。
你需要把你的图像标签定义为你类中的一个示例变量。在你的构造函数中,你可以做如下的事情:
在
setAlgebraicNotationLabel(...)
方法中,您将用途:将符号标签添加到图像标签,而不是面板
然后,您的
updatePiece(...)
方法也需要更改为使用setIcon(...)
方法来更新图像标签的Icon
,而不是每次都创建一个新标签。ocebsuys2#
我是这么做的:
我在图像标签的PAGE_END处添加符号标签,为此,图像标签布局为
setLayout(new BorderLayout());
最终结果: