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 保留以前的文本的主要内容,如果未能解决你的问题,请参考以下文章

垂直轴中间的 Java JLabel 文本

如何更新JLabel文本?

如何使 JLabel 中的文本居中?

组布局中的 JLabel - 冻结大小

如何将 JLabel 的文本放在其图标下

通过设置最大宽度使 JLabel 包装它的文本