有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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();

    }
}

共 (2) 个答案

  1. # 1 楼答案

    我推荐的气垫船和装满鳗鱼的气垫船一样,不过我会解释其背后的原因。 根据cuerrent设置,JLabel会用不透明颜色填充所有透明像素。马里奥是否会这样并不重要。png有一个透明的背景,因为实现它的JLabel用背景的颜色填充透明像素。有两种可能的解决方法。按照气垫船的建议,使用单数JLabel,或者改用JComponent。 我建议使用后者,就像你正在编程一个游戏一样,这样你就不会希望你的马里奥精灵与背景一起移动,在你目前的情况下,你对JComponent类有更多的控制

    以下是JComponent类的Oracle文档: https://docs.oracle.com/javase/tutorial/uiswing/components/jcomponent.html

    如果您愿意,我愿意给您提供简化的示例代码

  2. # 2 楼答案

    JLabel本质上是透明的,因为它的不透明属性默认为false(与JPanel不同,JPanel在默认情况下是不透明的),因此,如果您将透明图像放置到ImageIcon中,并通过.setIcon(...)使其成为JLabel的图标,并将JLabel添加到容器(如JPanel),则显示的图标的透明区域将保持透明,显示背景图像。例如,将此图像视为精灵,显示周围有透明像素的填充圆:

    enter image description here

    因此,如果将鼠标侦听器添加到JLabel中,它可以在容器周围拖动

    例如

    import java.awt.*;
    import java.awt.event.*;
    import java.io.IOException;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class SpriteOnBackground extends JPanel {
        // Image attribution:
        // By Adam Evans - M31, the Andromeda Galaxy (now with h-alpha)
        // Uploaded by NotFromUtrecht, CC BY 2.0, 
        // https://commons.wikimedia.org/w/index.php?curid=12654493
        public static final String ANDROMEDA_IMAGE = "https://upload.wikimedia.org/wikipedia/commons/"
                + "thumb/9/98/Andromeda_Galaxy_%28with_h-alpha%29.jpg/"
                + "1280px-Andromeda_Galaxy_%28with_h-alpha%29.jpg";
        public static final String SPRITE_IMAGE = "https://upload.wikimedia.org/wikipedia/commons/"
                + "thumb/a/a1/Glossy_3d_blue_blue2.png/"
                + "120px-Glossy_3d_blue_blue2.png";
        private Image background;
        private JLabel spriteLabel = new JLabel();
    
        public SpriteOnBackground(Image bg, Image spriteImg) {
            background = bg;
            spriteLabel.setIcon(new ImageIcon(spriteImg));
            spriteLabel.setSize(spriteLabel.getPreferredSize());
            setLayout(null);
            add(spriteLabel);
    
            MyMouse myMouse = new MyMouse();
            spriteLabel.addMouseListener(myMouse);
            spriteLabel.addMouseMotionListener(myMouse);
        }
    
        @Override
        public Dimension getPreferredSize() {
            if (isPreferredSizeSet() || background == null) {
                return super.getPreferredSize();
            }
            // make JPanel the size of the image
            int w = background.getWidth(this);
            int h = background.getHeight(this);
            return new Dimension(w, h);
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            // draw background image
            g.drawImage(background, 0, 0, this);
        }
    
        // mouse listener to drag the JLabel around the GUI
        private class MyMouse extends MouseAdapter {
            private Point p1;
            private Point pSprite;
    
            @Override
            public void mousePressed(MouseEvent e) {
                p1 = e.getLocationOnScreen();
                pSprite = spriteLabel.getLocation();
            }
    
            @Override
            public void mouseDragged(MouseEvent e) {
                if (p1 != null) {
                    moveSprite(e);
                }
            }
    
            private void moveSprite(MouseEvent e) {
                Point p2 = e.getLocationOnScreen();
                int x = pSprite.x + p2.x - p1.x;
                int y = pSprite.y + p2.y - p1.y;
                Point newP = new Point(x, y);
                spriteLabel.setLocation(newP);
                repaint();
            }
    
            @Override
            public void mouseReleased(MouseEvent e) {
                if (p1 != null) {
                    moveSprite(e);
                }
                p1 = null;
            }
        }
    
        private static void createAndShowGui() {
            SpriteOnBackground mainPanel = null;
            try {
                URL backgroundUrl = new URL(ANDROMEDA_IMAGE);
                Image backGroundImg = ImageIO.read(backgroundUrl);
    
                URL spriteUrl = new URL(SPRITE_IMAGE);
                Image spriteImg = ImageIO.read(spriteUrl);
                mainPanel = new SpriteOnBackground(backGroundImg, spriteImg);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            JFrame frame = new JFrame("Sprite On Background");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    }