在另一个具有图像的 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
仅使用 icon
和 text
属性来确定首选布局大小,这最终可能会截断其子项
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")));
}
}
我正在尝试用 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
仅使用 icon
和 text
属性来确定首选布局大小,这最终可能会截断其子项
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")));
}
}