gpt4 book ai didi

java - JFrame 中的图像相互覆盖,而不是相互显示两个图像

转载 作者:行者123 更新时间:2023-12-01 10:19:24 26 4
gpt4 key购买 nike

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 默认使用 BorderLayout,这意味着在默认/CENTER 位置仅管理一张图像。

参见How to Use Borders了解更多详情。

解决方案实际上很困难,因为你需要能够对布局、图像和板的尺寸做出保证

您也许可以使用 GridLayoutGridBagLayout,但您需要有“空”填充组件才能允许布局正确展开,这可能会导致会很麻烦

也许更好的解决方案是使用自定义绘画方法,这样您就可以控制图像的放置位置。

Painting in AWT and SwingPerforming Custom Painting了解更多详情

以下示例仅使用 GridBagLayout,它允许您覆盖组件(以各种不同的方式)。此示例使 boardLabel 成为所有其他部分的容器,但是,由于 GridBagLayout 的工作方式,这不是绝对要求

Chess

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

}

}

通过这样的设置,您可以简单地使用 GridBagConstraintgridxgridy 值作为直接单元格地址(无需计算像素位置)。

由于布局管理器的工作方式,您还需要提供一个空单元格组件

关于java - JFrame 中的图像相互覆盖,而不是相互显示两个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35710453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com