Java JLabel保留以前的文本
当我花几分钟调整我的桌面时钟时,我发现了一个问题,如果没有帮助我似乎无法解决。。。我读过一些有类似问题的帖子,但解决方案对我来说并不奏效 时钟(采用典型的java形式,带有动作监听器和日历)工作正常预期调整:将框架、内容窗格和标签背景设置为透明,以便仅显示时间/文本 发生的情况是:当标签背景是透明的(或直到通过设置Alpha使其足够不透明时,不透明为真),基础的上一次显示保持透明且不清晰 为了帮助解决这个问题,我整理了以下代码-时间和日期日历/etc被排除在外。这段代码只是我尝试过的许多代码的一个版本,有/没有不透明、调用的位置等等 区别在于动作监听器的使用——如果动作监听器被注释/删除,标签的显示会很好。取消对操作侦听器的注释,问题就会出现 看到图片…感谢您的帮助…谢谢 仅供参考-下面:代码sans导入和注释 带黑色背景的时钟屏幕截图Java JLabel保留以前的文本,java,swing,opacity,jlabel,transparent,Java,Swing,Opacity,Jlabel,Transparent,当我花几分钟调整我的桌面时钟时,我发现了一个问题,如果没有帮助我似乎无法解决。。。我读过一些有类似问题的帖子,但解决方案对我来说并不奏效 时钟(采用典型的java形式,带有动作监听器和日历)工作正常预期调整:将框架、内容窗格和标签背景设置为透明,以便仅显示时间/文本 发生的情况是:当标签背景是透明的(或直到通过设置Alpha使其足够不透明时,不透明为真),基础的上一次显示保持透明且不清晰 为了帮助解决这个问题,我整理了以下代码-时间和日期日历/etc被排除在外。这段代码只是我尝试过的许多代码的一
问题的屏幕截图:
Swing组件无法与基于alpha的颜色配合使用。它们要么完全透明,要么完全不透明 如果指定组件为
isOpaque
,但使用半透明(alpha)颜色填充,则重绘管理器不会更新组件后面的区域,并且不会正确清除图形
上下文。请记住,图形
上下文是共享资源,因此在您的组件之前绘制的所有内容仍将被绘制
您可以查看更多详细信息
不过。最简单的解决方案是创建一个半透明窗格
,从JPanel
扩展,使其透明(非不透明),覆盖其paintComponent
方法,并从其内部绘制半透明(alpha)颜色。然后把你的标签加在上面
查看并获取更多详细信息与AWT标签相同的问题。。。但是,我不会放弃。。。这与动作监听器中标签的重新启动有关,这里有人有一个简单的解决方案。我不在乎它是否完全透明,它仍然不起作用。完全不透明显然有效,但透明(部分或完全)是我的目标。
public class Clear extends JFrame {
private JPanel contentPane;
Color ppColor = new Color(255, 255, 0, 0); // r,g,b,a
Color lblColor = new Color(225, 200, 200, 0);
Color lbl2Color = new Color(225, 200, 200, 254);
int delay = 1000;
JLabel lblTime = new JLabel("TESTING");
JLabel lblTime2 = new JLabel("XXXXXX");
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
final Clear frame = new Clear();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Clear() {
setUndecorated(true);
setBackground(ppColor);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(1680, 975, 128, 74);
contentPane = new JPanel();
contentPane.setBackground(ppColor);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
lblTime.setOpaque(true);
lblTime.setBackground(lblColor);
lblTime.setBounds(0, 0, 125, 30);
contentPane.add(lblTime);
lblTime2.setOpaque(true);
lblTime2.setBackground(lbl2Color);
lblTime2.setBounds(0, 33, 125, 16);
contentPane.add(lblTime2);
ActionListener myTaskPerformer = new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
lblTime.setText("Does it");
lblTime2.setText("work? ");
}
};
new Timer(delay, myTaskPerformer).start();
}
}