JLabel 保留以前的文本
Posted
技术标签:
【中文标题】JLabel 保留以前的文本【英文标题】:JLabel retains previous text 【发布时间】:2013-08-08 03:50:58 【问题描述】:在花几分钟时间调整我的桌面时钟时,我发现了一个我似乎无法在没有帮助的情况下解决的问题...我阅读了一些有类似问题的帖子,但解决方案对我不起作用。
时钟(以典型的 Java 形式,带有动作监听器和日历)工作得很好。 预期的调整:将 Frame、ContentPane 和 Label 背景设置为透明,以便仅显示时间/文本。
发生的情况是这样的:当标签背景是透明的(或者在 Opaque 为 true 时通过设置 Alpha 直到它足够不透明),底层之前的显示保持不变。
为了帮助解决这个问题,我将以下代码放在一起 - 时间和日期日历的东西/等被排除在外。这段代码只是我尝试过的许多版本中的一个版本,有/没有不透明,调用的位置......等等。
不同的是使用动作监听器 - 如果动作监听器被评论/删除,标签的显示正常。取消注释 Action Listener 并出现问题。
查看图片...感谢您的帮助...谢谢!
fyi - 下面:代码没有导入和 cmets...
黑色背景时钟截图
问题截图:
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();
【问题讨论】:
【参考方案1】:Swing 组件不适用于基于 alpha 的颜色。它们要么完全透明,要么完全不透明。
如果您将组件指定为 isOpaque
,但使用半透明 (alpha) 颜色填充它,则重绘管理器将不会更新组件后面的区域,并且 Graphics
上下文将不会被正确清除。请记住,Graphics
上下文是共享资源,因此在组件之前绘制的所有内容仍将被绘制
您可以查看Java Swing Graphical Glitches Dealing with Transparency and Images了解更多详情。
但是。最简单的解决方案是创建一个TranslucentPane
,扩展自JPanel
之类的东西,使其透明(不透明),覆盖它的paintComponent
方法并在其中绘制半透明(alpha)颜色。然后在上面添加你的标签。
查看Performing Custom Painting 和Painting in AWT and Swing 了解更多详情
【讨论】:
与 AWT 标签相同的问题...但是,我不会放弃...这与在动作侦听器中重新触发标签有关,这里有人有一个简单的解决方案.我不在乎它是否完全透明,它仍然不起作用。完全不透明显然可行,但透明(部分或完全)是我的目标。以上是关于JLabel 保留以前的文本的主要内容,如果未能解决你的问题,请参考以下文章