java如何在JLabel中使ImageIcon的背景透明
我想使用JLabels和ImageIcon将一个图像放到另一个图像上。一切正常,但我不知道如何使图像的背景透明。基本上我想编程一个游戏,但我不希望玩家是一个完美的矩形。这是我的代码,到目前为止它是有效的:
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Game {
JFrame frame = new JFrame();
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
public Game() {
frame.setVisible(true);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setTitle("just a test");
frame.setResizable(true);
frame.getContentPane().setLayout(null);
frame.setBounds(400, 200, 915, 600);
label1.setBounds(0, -195, 900, 890);
label2.setBounds(50, 200, 260, 240);
frame.getContentPane().add(label2);
frame.getContentPane().add(label1);
ImageIcon icon1 = new ImageIcon("icons/landscape.png");
ImageIcon icon2 = new ImageIcon("icons/mario1.png");
label1.setIcon(icon1);
label2.setIcon(icon2);
}
public static void main(String[] args) {
Game game = new Game();
}
}
# 1 楼答案
我推荐的气垫船和装满鳗鱼的气垫船一样,不过我会解释其背后的原因。 根据cuerrent设置,JLabel会用不透明颜色填充所有透明像素。马里奥是否会这样并不重要。png有一个透明的背景,因为实现它的JLabel用背景的颜色填充透明像素。有两种可能的解决方法。按照气垫船的建议,使用单数JLabel,或者改用JComponent。 我建议使用后者,就像你正在编程一个游戏一样,这样你就不会希望你的马里奥精灵与背景一起移动,在你目前的情况下,你对JComponent类有更多的控制
以下是JComponent类的Oracle文档: https://docs.oracle.com/javase/tutorial/uiswing/components/jcomponent.html
如果您愿意,我愿意给您提供简化的示例代码
# 2 楼答案
JLabel本质上是透明的,因为它的不透明属性默认为false(与JPanel不同,JPanel在默认情况下是不透明的),因此,如果您将透明图像放置到ImageIcon中,并通过
.setIcon(...)
使其成为JLabel的图标,并将JLabel添加到容器(如JPanel),则显示的图标的透明区域将保持透明,显示背景图像。例如,将此图像视为精灵,显示周围有透明像素的填充圆:因此,如果将鼠标侦听器添加到JLabel中,它可以在容器周围拖动
例如