簡體   English   中英

Java AWT在半透明框架上繪制

[英]Java AWT Draw on Translucent Frame

我在半透明框架上繪制時遇到麻煩。 當“ alphaValue”為255時,一切正常。 但是我需要一個半透明的框架。 我在下面創建了一個小測試類來演示該問題。 如您所見,“ MIDDLE”矩形始終出現。 但是,“ DRAW”矩形僅在“ alphaValue”為255時出現。當其<= 254時,您可以通過打印行看到仍然調用該方法,但圖像似乎沒有刷新。 預先感謝您的任何幫助。

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組件本身沒有透明性的概念,它們始終是不透明的。

您已經使用了JPanel ,並使用setOpaque來控制其透明度(打開或關閉)。 這將使面板變得透明,然后您應該能夠直接將alpha效果應用於框架...

透明

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

暫無
暫無

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

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