Java在半透明框架面板组件上重新绘画。

Java在半透明框架面板组件上重新绘画。,第1张

Java在半透明框架/面板/组件上重新绘画。

我有一些运气可以扩展

JLabel
和实现,
Icon
以使半透明组件按我想要的方式工作。你可以在此AlphaCompositeDemo中看到各种规则组合的结果。下面的示例是100%白色,50%黑色。

附录:请注意,此示例如何在半透明框架背景上的透明屏幕外背景上合成不透明文本。

附录:这是使整个框架透明的一种方法。不幸的是,它也使内容变暗。

import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.text.SimpleDateFormat;import java.util.Date;import javax.swing.Jframe;import javax.swing.JPanel;import javax.swing.Timer;public class Translucent extends JPanel implements ActionListener {    private static final int W = 300;    private static final int H = 100;    private static final Font font =        new Font("Serif", Font.PLAIN, 48);    private static final SimpleDateFormat df =        new SimpleDateFormat("HH:mm:ss");    private final Date now = new Date();    private final Timer timer = new Timer(1000, this);    private BufferedImage time;    private Graphics2D timeG;    public Translucent() {        super(true);        this.setPreferredSize(new Dimension(W, H));        timer.start();    }    @Override    protected void paintComponent(Graphics g) {        Graphics2D g2d = (Graphics2D) g;        g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);        int w = this.getWidth();        int h = this.getHeight();        g2d.setComposite(AlphaComposite.Clear);        g2d.fillRect(0, 0, w, h);        g2d.setComposite(AlphaComposite.Src);        g2d.setPaint(g2d.getBackground());        g2d.fillRect(0, 0, w, h);        renderTime(g2d);        int w2 = time.getWidth() / 2;        int h2 = time.getHeight() / 2;        g2d.setComposite(AlphaComposite.SrcOver);        g2d.drawImage(time, w / 2 - w2, h / 2 - h2, null);    }    private void renderTime(Graphics2D g2d) {        g2d.setFont(font);        String s = df.format(now);        FontMetrics fm = g2d.getFontMetrics();        int w = fm.stringWidth(s);        int h = fm.getHeight();        if (time == null && timeG == null) { time = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); timeG = time.createGraphics(); timeG.setRenderingHint(     RenderingHints.KEY_ANTIALIASING,     RenderingHints.VALUE_ANTIALIAS_ON); timeG.setFont(font);        }        timeG.setComposite(AlphaComposite.Clear);        timeG.fillRect(0, 0, w, h);        timeG.setComposite(AlphaComposite.Src);        timeG.setPaint(Color.green);        timeG.drawString(s, 0, fm.getAscent());    }    private static void create() {        Jframe f = new Jframe();        f.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);        f.setBackground(new Color(0f, 0f, 0f, 0.3f));        f.setUndecorated(true);        f.add(new Translucent());        f.pack();        f.setLocationRelativeTo(null);        f.setVisible(true);    }    @Override    public void actionPerformed(ActionEvent e) {        now.setTime(System.currentTimeMillis());        this.repaint();    }    public static void main(String[] args) {        EventQueue.invokeLater(new Runnable() { @Override public void run() {     create(); }        });    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5021592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存