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

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

如何解决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();
        }
    });
}

}
解决方法
我正在尝试在OSX上使用Java创建一个半透明窗口并将其添加JLabel到其中。

这JLabel每秒更改一次文本。

替代文字

但是,该组件不能很好地重新粉刷。

我怎么解决这个问题?

我已经找到了这些 文章,但是我不知道该如何解决。

如果可能,请粘贴修复源代码,这是我的:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Color;
import java.awt.Font;
import java.util.Timer;
import java.util.TimerTask;
public class Translucent {

public static void main( String [] args ) {
    JFrame frame = new JFrame();
    frame.setBackground( new Color( 0.0f,0.0f,0.3f));
    final JLabel label =  new JLabel("Hola");
    label.setFont( new Font( label.getFont().getFamily(),Font.PLAIN,46 ) );
    label.setForeground( Color.white );
    frame.add( label );
    frame.pack();
    frame.setLocationRelativeTo( null );
    frame.setVisible( true );
    Timer timer = new Timer();
    timer.schedule( new TimerTask(){
        int i = 0;
        public void run() {
            label.setText("Hola "+ i++ );
        }
    },1000 );
}   

}

声明:地推任务网所有作品(图片、文字)均由用户自行上传分享,仅供网友学习交流。

相关文章
|
4天前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
9 0
|
4天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
7 0
|
6天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
52 0
|
6天前
|
存储 安全 Java
深入理解Java集合框架
深入理解Java集合框架
11 0
|
14天前
|
Java API 数据安全/隐私保护
【亮剑】如何在Java项目中结合Spring框架实现邮件发送功能
【4月更文挑战第30天】本文介绍了如何在Java项目中结合Spring框架实现邮件发送功能。首先,需在`pom.xml`添加Spring和JavaMail依赖。然后,在`applicationContext.xml`配置邮件发送器,包括SMTP服务器信息。接着,创建一个使用依赖注入的`EmailService`类,通过`JavaMailSender`发送邮件。最后,调用`EmailService`的`sendSimpleEmail`方法即可发送邮件。最佳实践包括:使用配置管理敏感信息,利用`MimeMessage`构造复杂邮件,异常处理和日志记录,以及在大量发送时考虑使用邮件队列。
|
20天前
|
存储 Java 索引
深入探讨Java集合框架
深入探讨Java集合框架
深入探讨Java集合框架
|
20天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
1天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第13天】在计算机科学中,多线程是一种使得程序可以同时执行多个任务的技术。在Java语言中,多线程的实现主要依赖于java.lang.Thread类和java.lang.Runnable接口。本文将深入探讨Java中的多线程编程,包括其基本概念、实现方法以及一些常见的问题和解决方案。
|
1天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第13天】 在Java开发中,并发编程是一个复杂且重要的领域。它不仅关系到程序的线程安全性,也直接影响到系统的性能表现。本文将探讨Java并发编程的核心概念,包括线程同步机制、锁优化技术以及如何平衡线程安全和性能。通过分析具体案例,我们将提供实用的编程技巧和最佳实践,帮助开发者在确保线程安全的同时,提升应用性能。
10 1