在另一个具有图像的 JLabel 之上放置一个 JLabel

Having a JLabel on top of another JLabel that has an image

我正在尝试用 GUI 制作棋盘游戏。我用玩家的名字创建了一个 JLabel 并想将其用作标记。然后我制作了另一个包含电路板图像的 JLabel。我将这两个标签添加到 boardPanel 上,现在,标签并排放置。我该怎么做才能让带名称的 JLabel 位于带 img 的 JLabel 上,而不是并排放置?

对于包含这两个标签的面板,我应该考虑什么?喜欢某个布局管理器?

[只是我的部分代码]

import java.awt.*;
import javax.swing.*;

public class BoardFrame extends JFrame {

   private JPanel mainPanel, boardImgPanel,jPanelSouth,buttonPanel
           ,cardPanel,statsPanel;
   private boardImgLabel;

   Player player1;

   public BoardFrame() {
      //boardPanel and stuff in it
      boardImgPanel = new JPanel();
      boardImgLabel = new JLabel();
      boardImgLabel.setIcon(new ImageIcon("BOARDPICTUREHERE"));
      boardImgPanel.add(boardImgLabel);

      /////////////////////ADDING PLAYERS/////////////////////
      player1 = new Player("Steven", 1,1,1,1,1);
      JLabel player1Label = new JLabel(player1.getPlayerName());
      boardImgPanel.add(player1Label);

      mainPanel = new JPanel(new GridLayout(0, 1));

      add(mainPanel);

   }
}

类似这样,但显然不是猫,而是棋盘图像,文本是玩家名称。

编辑

我制作了一个扩展 jpanel 的 class,然后想将它添加到 BoardFrame class

import java.awt.BorderLayout;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class BoardPanelNorth extends JPanel {
        File imageFile = new File("....");

        JLabel boardImgLabel = new JLabel();
        Player player1;

        public BoardPanelNorth() {
            setLayout(new BorderLayout());
            try {
                boardImgLabel = new JLabel(new ImageIcon(ImageIO.read(imageFile)));
                boardImgLabel.setLayout(new BorderLayout());

                player1 = new Player("Steven", 1,1,1,1,1);
                JLabel player1Label = new JLabel(player1.getPlayerName());
                player1Label.setFont(player1Label.getFont().deriveFont(128f));
                player1Label.setHorizontalAlignment(JLabel.RIGHT);
                player1Label.setVerticalAlignment(JLabel.BOTTOM);
                player1Label.setForeground(Color.WHITE);

                add(boardImgLabel);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

}

板框class:

import java.awt.*;
import javax.swing.*;

public class BoardFrame extends JFrame {

   private JPanel mainPanel, boardImgPanel;
   private JSplitPane splitPane;

   public BoardFrame() {

      boardImgPanel = new BoardPanelNorth();


      //split plane
      splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
         new JScrollPane(boardImgPanel), jPanelSouth);
      splitPane.setDividerLocation(470); //top size
      splitPane.enable(false); //cant adjust


      mainPanel = new JPanel(new GridLayout(0, 1));
      mainPanel.add(splitPane);

      add(mainPanel);

   }
}

玩家史蒂文似乎仍然没有出现在地图上。

您可以使用 OverlayLayout 或者您可以简单地将第二个 JLabel 添加到第一个。不过这里的技巧是为第一个标签设置布局管理器。

请注意,JLabel 仅使用 icontext 属性来确定首选布局大小,这最终可能会截断其子项

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            try {
                JLabel background = new JLabel(new ImageIcon(ImageIO.read(...)));
                background.setLayout(new BorderLayout());
                JLabel text = new JLabel("I'm just drawn this way");
                text.setFont(text.getFont().deriveFont(128f));
                text.setHorizontalAlignment(JLabel.RIGHT);
                text.setVerticalAlignment(JLabel.BOTTOM);
                text.setForeground(Color.WHITE);

                background.add(text);

                add(background);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    }

}

我在我的 GUI 项目中执行以下操作: 1.make 带有 OverlayLayout 的 jPanel 2.put 两个 jlabels 到 jPanel 3.make keyEvent 或类似的东西

enter image description here enter image description here 我的 GUI 项目示例代码:

    private void jLabel2KeyPressed(java.awt.event.KeyEvent evt) {
int i = evt.getKeyCode();
  switch (i) {
 // some parts of my code }
if(k5==true&&ke==true&&k1==false&&k3==false) {
jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/audit/images/tie.png")));

 jLabel177.setIcon(new javax.swing.ImageIcon(getClass().getResource("/audit/images/tie1forbigroad.png")));
}
}