我想使用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();
}
}
答案 0 :(得分:1)
尽管我将解释其背后的原因,但我还是推荐与“气垫船充满鳗鱼”相同的东西。 根据您的设置,您的JLabel将使用不透明的颜色填充所有透明的像素。 mario1.png是否具有透明背景无关紧要,因为在其中实现了JLabel的JLabel会用背景颜色填充透明像素。有两个潜在的解决方案。按照Hovercraft的建议,使用单数JLabel,或者改用JComponent。 我建议使用后者,就好像您在编写游戏一样,那么您不希望将Mario Sprite移到后台,并且在当前情况下您可以更好地控制JComponent类。
这是JComponent类的Oracle文档: https://docs.oracle.com/javase/tutorial/uiswing/components/jcomponent.html
如果您愿意,我愿意为您提供简化的示例代码。
答案 1 :(得分:1)
JLabel本质上是透明的-也就是说,它的opaque属性默认情况下为false(与默认情况下不透明的JPanel不同),因此,如果您将透明图像放入ImageIcon中,并通过{{ 1}},并将JLabel添加到诸如JPanel之类的容器中,显示的图标的透明区域将保持透明,显示背景图像。例如,假设此图像为sprite,则在其周围显示带有透明像素的实心圆:
因此,如果将鼠标侦听器添加到JLabel,则可以将其拖动到容器周围。
例如
import { store } from './store'
import { observer } from 'mobx-react';
fetch(`http://${store.URL}/login`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: this.state.email,
password: this.state.password
})
}).then(res => res.json()).then(res => {
if (res.token) {
store.setAuthToken(res.token)
store.setTerm(res.term)
store.setBuses(res.buses.sort((a, b) => {
let first = a.fields[0].time, second = b.fields[0].time;
let firstArr = first.split(":", 2), secondArr = second.split(":", 2);
if (firstArr[0] !== secondArr[0])
return firstArr[0] - secondArr[0];
else
return firstArr[1] - secondArr[1];
}))
this.props.navigation.navigate("App")
}
if (res.error) {
this.setState({error: res.error})
}
}).catch(err => console.log(err))