簡體   English   中英

透明JFrame的問題

[英]Problems with transparent JFrame

我創建了JFrame,將透明顏色(新Color(0,0,0,0))設置為背景,並將JPanel放在其上。 我已經重寫了JPanel的paintComponent方法,並繪制了一些帶有alpha通道的圖像。 當用戶右鍵單擊我的JPanel時,我也會顯示彈出菜單。

而且我面臨着這樣一個事實,即彈出菜單的圖像在消失后仍保留在JFrame中(現在,JPanel的圖片覆蓋了它)。 據我了解,在繪制新框架之前不會清除JFrame。

public class MainWindow extends JFrame {

    private MyPanel widget = new MyPanel();
    private Action quitAction = new AbstractAction("Quit") {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            setVisible(false);
            dispose();
        }
    };

    private MainWindow() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setUndecorated(true);
        setBackground(new Color(0, 0, 0, 0));
        widget.loadImage("image.png");
        setContentPane(widget);
        pack();
        setAlwaysOnTop(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(() -> {
            MainWindow window = new MainWindow();
            window.setVisible(true);
        });
    }

    class MyPanel extends JPanel implements MouseListener {
        BufferedImage image;

        MyPanel() {
            super();
            addMouseListener(this);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintCompontent(g);
            if (characterImage != null) {
                g.drawImage(characterImage, 0, 0, this);
            }
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
            clickPos = e.getLocationOnScreen();
            if (SwingUtilities.isRightMouseButton(e)) {
                JPopupMenu popupMenu = new JPopupMenu();
                popupMenu.add(quitAction);
                popupMenu.show(this, e.getX(), e.getY());
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

        boolean loadImage(String name) {
            BufferedImage backupImage = image;
            try {
                image = ImageIO.read(MainWindow.class.getResourceAsStream("/images/" + name));
                setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
            } catch (IOException ex) {
                image = backupImage;
                return false;
            }
            return true;
        }

    }

}

因此,基於您的代碼,一旦我將其糾正為可以正常工作,我似乎就沒有任何問題

透明彈出菜單

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class MainWindow extends JFrame {

    private MyPanel widget = new MyPanel();
    private Action quitAction = new AbstractAction("Quit") {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            setVisible(false);
            dispose();
        }
    };

    private MainWindow() {
        super();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setUndecorated(true);
        setBackground(new Color(0, 0, 0, 0));
        widget.loadImage("MT.png");
        setContentPane(widget);
        pack();
        setLocationRelativeTo(null);
        setAlwaysOnTop(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(() -> {
            MainWindow window = new MainWindow();
            window.setVisible(true);
        });
    }

    class MyPanel extends JPanel implements MouseListener {

        BufferedImage image;

        MyPanel() {
            super();
            addMouseListener(this);
            setOpaque(false);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
            if (image != null) {
                g.drawImage(image, 0, 0, this);
            }
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
//            clickPos = e.getLocationOnScreen();
            if (SwingUtilities.isRightMouseButton(e)) {
                JPopupMenu popupMenu = new JPopupMenu();
                popupMenu.add(quitAction);
                popupMenu.show(this, e.getX(), e.getY());
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

        boolean loadImage(String name) {
            BufferedImage backupImage = image;
            try {
                image = ImageIO.read(MainWindow.class.getResourceAsStream("/images/" + name));
                setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
            } catch (IOException ex) {
                image = backupImage;
                return false;
            }
            return true;
        }

    }

}

我在代碼中發現了問題。 為了使一切正常工作,我需要在paintCompontent中使用g.drawImage在圖片繪制之前插入此代碼。

if (g instanceof Graphics2D) {
    Graphics2D g2d = (Graphics2D)g;
    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
}

此外,問題並非在所有情況下都出現。 例如,在Windows下它運行良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM