Java 如何显示JLabel';s图标位于另一个JLabel';s图标

Java 如何显示JLabel';s图标位于另一个JLabel';s图标,java,swing,jlabel,imageicon,Java,Swing,Jlabel,Imageicon,假设我正在使用swing构建一个国际象棋应用程序。我使用一个jlabel数组来表示棋盘(每个都有相应的图标设置为浅/暗阴影框)。我已经创建了另一个jlabel数组来保存国际象棋棋子的图标,但我对swing还不太熟悉,不知道如何实现它们以显示在棋盘的顶部。有人知道任何技术吗?我写了一个小示例,它在每个窗口上构建一个窗口和两个jLabel 请注意,grey.jpg和pawn.png图像的大小为128x128,而pawn图像的背景是透明的(这样可以防止pawn图像的背景隐藏灰色矩形框) 下面是构建窗口

假设我正在使用swing构建一个国际象棋应用程序。我使用一个jlabel数组来表示棋盘(每个都有相应的图标设置为浅/暗阴影框)。我已经创建了另一个jlabel数组来保存国际象棋棋子的图标,但我对swing还不太熟悉,不知道如何实现它们以显示在棋盘的顶部。有人知道任何技术吗?

我写了一个小示例,它在每个窗口上构建一个窗口和两个jLabel

请注意,grey.jpgpawn.png图像的大小为128x128,而pawn图像的背景是透明的(这样可以防止pawn图像的背景隐藏灰色矩形框)

下面是构建窗口并添加组件的ChessFrame类:

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class ChessFrame extends JFrame {

    private JPanel panel;
    private JLabel greyBox;
    private JLabel pawn;


    public ChessFrame() {
        super();

        /* configure the JFrame */
        this.setSize(300, 300);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


    public void addComponents() {
        panel = new JPanel();
        greyBox = new JLabel(new ImageIcon("images/grey.jpg"));
        pawn = new JLabel(new ImageIcon("images/pawn.png"));

        /* add the pawn inside the grey box (we have to set a layout for the grey box JLabel) */
        greyBox.setLayout(new BorderLayout());
        greyBox.add(pawn);

        /* add grey box to main JPanel and set its background to white so we observe the result better */
        panel.add(greyBox);
        panel.setBackground(Color.WHITE);

        this.getContentPane().add(panel);
    }


    @Override
    public void setVisible(boolean b) {
        super.setVisible(b);
    }

}
下面是一个主类,它创建一个ChessFrame对象并显示窗口:

public class Main {

    public static void main(String[] args) {
        ChessFrame chessFrame = new ChessFrame();

        chessFrame.addComponents();
        chessFrame.setVisible(true);
    }

}

JLabel
只是另一个组件,它可以包含其他组件,但您需要设置它的布局管理器,可以使用
BorderLayout
作为起点。1)虽然可以将组件添加到标签,它有一个缺点,即标签不再能够为布局管理器提供合适的首选大小。更好的方法是将BG颜色设置为显示图标的标签或添加标签的面板。2) 例如,获取图像的一种方法是热链接到中看到的图像。使用此实现,因为Bryan在JLabels:)的基础上询问了JLabels,所以我想走与问题相同的道路。另外,谢谢你的建议和图片的热链接。“我想走与问题相同的道路。”见。(是的,如果OP采取了错误的方法,并且有更好的解决方案,那么肯定是这样。)具体的例子可以在我对这个问题的评论中看到(对问题本身的回复),以及-该(已接受的)答案既不移动面板也不使用
TimerTask