将JLabel置于另一个具有图像的JLabel之上

所以我正在尝试用GUI制作棋盘游戏。 我用玩家的名字创建了一个JLabel,并希望将其用作令牌。 然后我制作了另一个包含棋盘图像的JLabel。 我将两个标签添加到了BoardPanel上,现在,标签是并排的。 我如何做到这一点,而不是它并排,JLabel W /名称是在JLabel w / img?

对于包含两个标签的面板,我应该考虑一些事情吗? 像某个布局管理器?

[只是我的代码部分]

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的类,然后想将它添加到BoardFrame类中

 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(); } } } 

Board Frame类:

 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(); } } } }