图像在JFrame的是覆盖彼此不超过海誓山盟
public class Board extends JFrame
{
public void bd()
{
JFrame frame=new JFrame();
JLabel background1 = new JLabel(new ImageIcon("background.png"));
JLabel knight=new JLabel(new ImageIcon("knight.jpg"));
frame.add(background1);
frame.add(knight);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
}
我已经遇到一些麻烦我的代码图像在JFrame的是覆盖彼此不超过海誓山盟
当我加入骑士图像的背景图像将消失,仅出现在骑士图像显示两个图像。 我如何会使图像重叠或者使背景图像用作背景
JLabel background1 = new JLabel(new ImageIcon("background.png"));
JLabel knight=new JLabel(new ImageIcon("knight.jpg"));
frame.add(background1);
frame.add(knight);
我猜你真正想要的是有顶部显示的骑士(在z轴),所以你需要做的是这样的:
JLabel background1 = new JLabel(new ImageIcon("background.png"));
background.setLayout(new BorderLayout());
JLabel knight=new JLabel(new ImageIcon("knight.jpg"));
background1.add(knight);
frame.add(background1);
这就是你需要遵循父/子层次:
- 添加背景框架
- 骑士增加背景
只是为了澄清,如果我想要多个图像在层次结构的同一级别,我会将它们添加到background1.add(additionalIamgae)l – thebigone
@thebigone ,是的,但是你会在背景标签上使用不同的布局管理器(也许是FlowLayout)。这是所有Swing组件的基础。他们遵循父母/子女关系。因此,无论何时您想在一个面板上使用多个组件,都可以将所有组件添加到同一个面板中。然后,布局管理器将根据布局管理器的规则安排组件。 – camickr
您也可以查看[背景面板](https://tips4java.wordpress.com/2008/10/12/background-panel/),它可以更加灵活地绘制背景。 – camickr
JFrame
使用BorderLayout
默认的,这意味着只有一个图像在默认的/ CENTER
位置进行管理。
查看How to Use Borders了解更多详情。
该解决方案实际上是困难的,因为你需要能够使该布局的大小,图像和董事会
你也许能够使用GridLayout
或GridBagLayout
担保,但你需要有“空的”填充组件,以使布局正确展开,这可能会带来麻烦
也许更好的解决方案可能是使用自定义绘画方法,它可以让您控制图像的放置位置。
Painting in AWT and Swing和Performing Custom Painting更多detals
下面的例子只是利用了GridBagLayout
,它允许你覆盖组件(以各种不同的方式)。这个例子使boardLabel
所有其他部分的容器,但是,由于方法GridBagLayout
的作品,这不是绝对的要求
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Chess {
public static void main(String[] args) {
new Chess();
}
public Chess() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
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);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public class TestPane extends JPanel {
public TestPane() throws IOException {
BufferedImage board = ImageIO.read(getClass().getResource("/board.png"));
BufferedImage knight = ImageIO.read(getClass().getResource("/Knight.png"));
setLayout(new BorderLayout());
JLabel boardLabel = new JLabel(new ImageIcon(board));
add(boardLabel);
boardLabel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int row = 0; row < 8; row++) {
gbc.gridy = row;
for (int col = 0; col < 8; col++) {
gbc.gridx = col;
boardLabel.add(filler(), gbc);
}
}
JLabel knightLabel = new JLabel(new ImageIcon(knight));
gbc.gridx = 3;
gbc.gridy = 4;
boardLabel.add(knightLabel, gbc);
}
protected JComponent filler() {
JLabel filler = new JLabel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
};
return filler;
}
}
}
有了这样的设置,你可以简单地使用GridBagConstraint
的gridx
和gridy
值作为直接单元地址(不需要计算像素位置)。
,因为布局管理器的工作方式,你需要提供一个空的电池组件以及
只是为了澄清的是,骑士的形象将是盈方background1图像 – thebigone
@Andrew汤普森是否有可能打开这个问题吗?我有一些解决方案,这可能会有助于OP实际上想要做什么... – user3437460
@ user3437460鉴于2个好答案,1个接受和重复状态,最好发布您的答案以回应新的(更具体的)你问的问题。 (就像我问/答复并用作重复的问答。) –