JPanel中的Java Swing中心JLabel,带有两个JLabel

zc0qhyus  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(115)

我在用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();
    }
}
but5z9lq

but5z9lq1#

图像未垂直居中,因为另一个JLabel占据了部分空间
这就是布局管理器的工作方式。组件在2D空间中被分配位置。因此,如果图像是60 X 60,则注解标签将显示在图像下方,而不是图像上方。
如果您希望注解标签显示在图像标签的顶部,则需要将注解标签添加到图像标签。
你需要把你的图像标签定义为你类中的一个示例变量。在你的构造函数中,你可以做如下的事情:

imageLabel = new ImageLabel();
imageLabel.setLayout( new BorderLayout() );
add( imageLabel );

setAlgebraicNotationLabel(position);
...

setAlgebraicNotationLabel(...)方法中,您将用途:

//add(squarePosition, BorderLayout.PAGE_END);
imageLabel.add(squarePosition, BorderLayout.PAGE_END);

将符号标签添加到图像标签,而不是面板
然后,您的updatePiece(...)方法也需要更改为使用setIcon(...)方法来更新图像标签的Icon,而不是每次都创建一个新标签。

ocebsuys

ocebsuys2#

我是这么做的:
我在图像标签的PAGE_END处添加符号标签,为此,图像标签布局为setLayout(new BorderLayout());

private JLabel getAlgebraicNotationLabel(int position) {
        JLabel notationLabel = new JLabel(getAlgebraicNotation(position));
        notationLabel.setBorder(new EmptyBorder(0, 5, 5, 0));
        return notationLabel;
}
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));
        } catch (IOException e) {
            // TODO: 20/3/23 Manejar excepció
            throw new RuntimeException(e);
        }

        /* Actualitza la casella */
        JLabel squareLabel = new JLabel(new ImageIcon(pieceImage));
        squareLabel.setLayout(new BorderLayout());
        squareLabel.add(getAlgebraicNotationLabel(position),BorderLayout.PAGE_END);
        add(squareLabel);
        validate();
}

最终结果:

相关问题