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

}

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

相关文章
|
2月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
20天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
39 3
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
4天前
|
并行计算 算法 Java
Java中的Fork/Join框架详解
Fork/Join框架是Java并行计算的强大工具,尤其适用于需要将任务分解为子任务的场景。通过正确使用Fork/Join框架,可以显著提升应用程序的性能和响应速度。在实际应用中,应结合具体需求选择合适的任务拆分策略,以最大化并行计算的效率。
36 23
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
56 4
|
2月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
89 2
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
65 0
|
14天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
69 17
|
25天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者