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

}

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

相关文章
|
13天前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
10天前
|
Java 数据库连接 Apache
Java进阶-主流框架总结与详解
这些仅仅是 Java 众多框架中的一部分。每个框架都有其特定的用途和优势,了解并熟练运用这些框架,对于每一位 Java 开发者来说都至关重要。同时,选择合适框架的关键在于理解框架的设计哲学、核心功能及其在项目中的应用场景。随着技术的不断进步,这些框架也在不断更新和迭代以适应新的开发者需求。
29 1
|
12天前
|
存储 Java 程序员
Java中的集合框架:从入门到精通
【8月更文挑战第30天】在Java的世界里,集合框架是一块基石,它不仅承载着数据的存储和操作,还体现了面向对象编程的精髓。本篇文章将带你遨游Java集合框架的海洋,从基础概念到高级应用,一步步揭示它的奥秘。你将学会如何选择合适的集合类型,掌握集合的遍历技巧,以及理解集合框架背后的设计哲学。让我们一起探索这个强大工具,解锁数据结构的新视角。
|
13天前
|
存储 算法 Java
Java中的集合框架深度解析云上守护:云计算与网络安全的协同进化
【8月更文挑战第29天】在Java的世界中,集合框架是数据结构的代言人。它不仅让数据存储变得优雅而高效,还为程序员提供了一套丰富的工具箱。本文将带你深入理解集合框架的设计哲学,探索其背后的原理,并分享一些实用的使用技巧。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
11天前
|
存储 算法 Java
Java中的集合框架深度解析与实践
【8月更文挑战第31天】在Java编程的海洋中,集合框架扮演着不可或缺的角色。本文将带你领略Java集合框架的魅力,从理论到实践,深入浅出地探索List、Set和Map等核心接口的使用技巧。我们将通过具体代码示例,展示如何在日常开发中高效运用这些工具,让你的代码更加优雅和高效。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往Java集合世界的大门。
|
19天前
|
并行计算 算法 Java
Java 中的 fork-join 框架详解
【8月更文挑战第23天】
39 0
|
21天前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
11 0
|
21天前
|
设计模式 JSON 前端开发
【Java 第十二篇章】SpringMvc 框架介绍
Spring MVC 是 Spring 框架中的模块,采用 MVC 设计模式构建 Web 应用。核心组件包括 DispatcherServlet、Controller、Model 和 View。流程始于 DispatcherServlet 接收并分发请求至 Controller,Controller 处理业务逻辑并与 Model 交互,再通过 View 展示结果。优势包括松耦合架构支持多种视图技术,强大的请求处理和数据绑定功能简化开发,以及易于与其他 Spring 模块和第三方库集成。
9 0
|
SQL Java 数据库连接
Java面试题日积月累(SSM框架面试题22道)
Java面试题日积月累(SSM框架面试题22道)
73 0
|
2月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
43 1