Java 在半透明框架/面板/组件上重新喷漆。
我试图在OSX上用Java创建一个半透明窗口,并在其中添加一个Java 在半透明框架/面板/组件上重新喷漆。,java,swing,macos,awt,paint,Java,Swing,Macos,Awt,Paint,我试图在OSX上用Java创建一个半透明窗口,并在其中添加一个JLabel 此JLabel每秒更改一次文本 但是,该组件没有很好地重新喷漆 我怎样才能解决这个问题 我已经找到了答案,但我不知道如何解决它 如果可能,请粘贴修复源代码,这是我的: import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import java.awt.Color; import java.awt.Font; i
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
的文本
有两种方法可以解决这个问题。如果不测试您的问题,我会使用javax.swing.Timer
类而不是java.util.Timer
类来解决它javax.swing.Timer
将确保在调度线程上触发事件
So(未测试代码):
另一种解决方法是继续使用
java.util.Timer
,但要确保使用EventQueue.invokeLater(Runnable)
以确保标签的更新在EDT上进行。我有幸扩展了JLabel
并实现了图标
,以使半透明组件按我想要的方式工作。您可以在本文中看到各种规则组合的结果。下面的例子是100%白色加50%黑色
附录:请注意此示例如何在透明的屏幕外背景和半透明的框架背景上合成不透明文本
增编:这里有一种方法可以让你。不幸的是,它也使内容变得模糊
我不知道这个问题是否解决了,但我在应用程序中用“Frame.repaint();”解决了它
因此,每隔一秒钟,我的帧就会被重新绘制,我的JLabel也会随着实际时间更新。尝试在计时器代码中重置背景,或者在整个面板上调用repaint。我想背景只是不知道它需要重新绘制。如果修复了它,我会给出答案,但现在这只是一个猜测。如果不清楚,如果你将相关内容从EDT中移除,那么你会得到你正在经历的工件——例如,绘制事件可能会出现故障。jjnguy:JLabel setText()方法应该已经自动触发重新验证;repaint()事件在此处可能起作用的原因是,它将被安排在EDT上,以便稍后执行。最好首先确保在EDT上完成初始setText()调用。我尝试将timertask切换为:timer.schedule(new timertask(){int I=0;public void run(){SwingUtilities.invokeLater(new Runnable(){public void run()){label.setText(“Hola”+i++;}}}}},0,1000);它不起作用因为不透明和半透明不能很好地相互作用。是的,我实际上尝试了
SwingUtilities.invokeLater
,它具有相同的效果(在EDT中发送消息),结果完全相同。我在发布之前将其删除,以使代码简短。@Liard:我已经尝试了你的代码(只是为了确保)但是它有完全相同的效果。+1用于添加屏幕截图。看起来很有希望。唯一的区别是,文本不应该是半透明的,而应该是不透明的(就像windows中的这个屏幕截图)但是考虑到我的代码的当前状态,我想这应该是OSX的解决方法。明天当我再次拥有Mac时,我会尝试一下。谢谢。哦,你不是在使用JLabel,而是直接在面板上绘制…嗯,我必须尝试一下。是的,在某个时候,你必须使用框架的背景进行合成。我将更新为sh如何处理不透明文本。这很好。谢谢。我在显示文本时仍然有点问题,在调整大小后打印的最后一个数字有一个“阴影”,但这是我可以接受的。因此,如果我理解正确,你要做的是在面板上绘制上一个数字,但字母组合是否为“清晰”我假设它清除了面板,然后你在上面画画。这是原理吗?我会进一步看代码。这是一个小“幽灵”:现在这很奇怪。如果我调用setUndercorated(true)
幽灵消失了。我不知道为什么?。。。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mreg;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/**
*
* @author Manoj
*/
public class TranscluentWindow {
public static void main(String[] args) {
new TranscluentWindow();
}
public TranscluentWindow() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JWindow frame = new JWindow();
frame.setAlwaysOnTop(true);
frame.addMouseListener(new MouseAdapter() {
});
frame.setBackground(new Color(0,0,0,0));
frame.setContentPane(new TranslucentPane());
frame.add(new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/124742-high-school-collection/png/image_4.png")))));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2500);
} catch (InterruptedException ex) {
}
frame.dispose();
new loging().setVisible(true);
}
}).start();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public class TranslucentPane extends JPanel {
public TranslucentPane() {
setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(0.0f));
g2d.setColor(getBackground());
g2d.fillRect(0, 0, getWidth(), getHeight());
}
}
}
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();
}
});
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mreg;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/**
*
* @author Manoj
*/
public class TranscluentWindow {
public static void main(String[] args) {
new TranscluentWindow();
}
public TranscluentWindow() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JWindow frame = new JWindow();
frame.setAlwaysOnTop(true);
frame.addMouseListener(new MouseAdapter() {
});
frame.setBackground(new Color(0,0,0,0));
frame.setContentPane(new TranslucentPane());
frame.add(new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/124742-high-school-collection/png/image_4.png")))));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2500);
} catch (InterruptedException ex) {
}
frame.dispose();
new loging().setVisible(true);
}
}).start();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public class TranslucentPane extends JPanel {
public TranslucentPane() {
setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(0.0f));
g2d.setColor(getBackground());
g2d.fillRect(0, 0, getWidth(), getHeight());
}
}
}