如何在JLabel中使ImageIcon的背景透明

时间:2019-03-21 14:24:24

标签: java swing jframe 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();

    }
}

2 个答案:

答案 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,则在其周围显示带有透明像素的实心圆:

enter image description here

因此,如果将鼠标侦听器添加到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))