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

}

});

}

}

2020-03-04

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值