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

}

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

相关文章
|
1月前
|
Java 数据安全/隐私保护 索引
(Java)Java里JFrame窗体的基本操作(组件篇-3)
回顾 说过了下拉框和下拉列表,本篇内容将了解滚动面板和各类输入框 什么是组件? 如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入; 另:在使用组件前,请先将窗体中的内容类给实例化出来进行操作,代码如下: Container c = getContentPane(); JScollPane JScollPane类,说的就是滚动面板。它不同于其他组件,它是一个容器,
71 1
|
1月前
|
Java 索引 容器
(Java)Java里JFrame窗体的基本操作(组件篇-2)
回顾 这算是JFrame窗体基本操作的组件第二篇了,上一篇说过了单选框,复选框,按钮。 在这一篇中,我会说明下拉框和列表框 什么是组件? 自行百度:java中JFrame窗体里的组件是什么? 名字都给你想好了 ( :I ) JComBox下拉框 JComBox类,就是下拉框,实例化出来后,要填写泛型<>,添加是什么数据类型的内容,泛型中就写上该数据类型; JComboBox<?> combox = new JComboBox<>(); 以下实例化下拉框的时候我泛型写的全
80 1
|
1月前
|
Java 容器
(Java)Java里JFrame窗体的基础操作(组件-1)
如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,当然这只是在不熟悉组件的前提下。如果深入了解了组件,那么它有着非常多的组件,这些组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入
54 0
|
1月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
2月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
1370 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
1月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
1月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
118 8
|
1月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
72 7
|
2月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
190 12
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
231 1