我正在尝试在OSX上使用Java创建一个半透明窗口并将其添加JLabel到其中。
这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.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%黑色。
Icon
附录:请注意,此示例如何在半透明框架背景上的透明屏幕外背景上合成不透明文本。
附录:这是使整个框架透明的一种方法。不幸的是,它也使内容变暗。
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(); } }); } }