gpt4 book ai didi

java - 在半透明框架/面板/组件上重新绘制。

转载 作者:太空狗 更新时间:2023-10-29 22:54:10 26 4
gpt4 key购买 nike

我正在尝试在 OSX 上使用 Java 创建一个半透明窗口并向其添加一个 JLabel

JLabel 每秒更改其文本....

alt text

但是该组件没有很好地重绘。

我该如何解决这个问题?

我找到了 these articles ,但我不知道如何解决它。

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

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.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++ );
}
}, 0, 1000 );


}
}

最佳答案

我很幸运地扩展了 JLabel 并实现了 Icon 以使半透明组件按我想要的方式工作。您可以在这个 AlphaCompositeDemo 中看到各种规则组合的结果. 下面的示例是 100% 白色和 50% 黑色。

附录:请注意此示例如何在半透明框架背景上的清晰屏幕外背景上合成不透明文本。

附录:这是制作 whole frame translucent 的方法.不幸的是,它也会使内容变暗。

image

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

关于java - 在半透明框架/面板/组件上重新绘制。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2163544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com