简体   繁体   中英

Java AWT Draw on Translucent Frame

I am having trouble drawing on a translucent frame. When the "alphaValue" is 255 everything works as expected. But I need a translucent frame. I created a small test class below that demonstrates the problem. As you can see the "MIDDLE" rectangle appears all the time. But the "DRAW" rectangle only appears when "alphaValue" is 255. When it is <=254 you can see via print lines that the method is still called, but the image does not appear to refresh. Thank you in advance for any help.

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class TransparencyTest {
    private static Point startPoint = new Point();
    private static Point endPoint = new Point();

    public static void main(String[] args) {
        new TransparencyTest().test();
    }

    @SuppressWarnings("serial")
    private void test() {
        int alphaValue = 255;

        Frame myFrame = new Frame();
        myFrame.setUndecorated(true);
        myFrame.setBackground(new Color(0, 0, 0, alphaValue));
        myFrame.setSize(800, 800);

        Panel myPanel = new Panel() {
            public void paint(Graphics g) {
                super.paint(g);
                System.out.println("PAINT");
                g.setColor(new Color(255, 0, 0, 255));
                if(startPoint.equals(new Point())) {
                    System.out.println("MIDDLE");
                    g.drawRect(200, 200, 400, 400);
                }
                else {
                    System.out.println("DRAW");
                    g.drawRect(
                            (int)Math.min(startPoint.getX(), endPoint.getX()),
                            (int)Math.min(startPoint.getY(), endPoint.getY()),
                            (int)Math.abs(startPoint.getX() - endPoint.getX()),
                            (int)Math.abs(startPoint.getY() - endPoint.getY())
                    );
                }
            }
        };
        myFrame.add(myPanel);

        MouseAdapter myMouseAdapter = new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                startPoint = e.getPoint();
            }

            public void mouseDragged(MouseEvent e) {
                endPoint = e.getPoint();
                myPanel.repaint();
            }
        };
        myPanel.addMouseListener(myMouseAdapter);
        myPanel.addMouseMotionListener(myMouseAdapter);

        myFrame.setVisible(true);
    }
}

AWT components don't have a concept of transparency in of themselves, they are always opaque.

You have use a JPanel , which you use setOpaque to control the opacity (on or off) with. This will allow the panel to become see through and you should then be able to see the alpha affect applied directly to the frame...

透明

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TransparencyTest {

    private static Point startPoint = new Point();
    private static Point endPoint = new Point();

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                new TransparencyTest().test();
            }
        });
    }

    @SuppressWarnings("serial")
    private void test() {
        int alphaValue = 128;

        JFrame myFrame = new JFrame();
        myFrame.setUndecorated(true);
        myFrame.setBackground(new Color(0, 0, 0, alphaValue));
//      myFrame.setOpacity(0.1f);
        myFrame.setSize(800, 800);
        myFrame.setLocation(100, 100);

        JPanel myPanel = new JPanel() {
            public void paintComponent(Graphics g) {
                super.paintComponent(g);

                System.out.println("PAINT");
                g.setColor(new Color(255, 0, 0, 255));
                if (startPoint.equals(new Point())) {
                    System.out.println("MIDDLE");
                    g.drawRect(200, 200, 400, 400);
                } else {
                    System.out.println("DRAW");
                    g.drawRect(
                            (int) Math.min(startPoint.getX(), endPoint.getX()),
                            (int) Math.min(startPoint.getY(), endPoint.getY()),
                            (int) Math.abs(startPoint.getX() - endPoint.getX()),
                            (int) Math.abs(startPoint.getY() - endPoint.getY())
                    );
                }
            }
        };
        myPanel.setOpaque(false);
        myFrame.add(myPanel);

        MouseAdapter myMouseAdapter = new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                startPoint = e.getPoint();
            }

            public void mouseDragged(MouseEvent e) {
                endPoint = e.getPoint();
                myPanel.repaint();
            }
        };
        myPanel.addMouseListener(myMouseAdapter);
        myPanel.addMouseMotionListener(myMouseAdapter);

        myFrame.setVisible(true);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM