Java JLabel保留以前的文本

Java JLabel保留以前的文本,java,swing,opacity,jlabel,transparent,Java,Swing,Opacity,Jlabel,Transparent,当我花几分钟调整我的桌面时钟时,我发现了一个问题,如果没有帮助我似乎无法解决。。。我读过一些有类似问题的帖子,但解决方案对我来说并不奏效 时钟(采用典型的java形式,带有动作监听器和日历)工作正常预期调整:将框架、内容窗格和标签背景设置为透明,以便仅显示时间/文本 发生的情况是:当标签背景是透明的(或直到通过设置Alpha使其足够不透明时,不透明为真),基础的上一次显示保持透明且不清晰 为了帮助解决这个问题,我整理了以下代码-时间和日期日历/etc被排除在外。这段代码只是我尝试过的许多代码的一

当我花几分钟调整我的桌面时钟时,我发现了一个问题,如果没有帮助我似乎无法解决。。。我读过一些有类似问题的帖子,但解决方案对我来说并不奏效

时钟(采用典型的java形式,带有动作监听器和日历)工作正常预期调整:将框架、内容窗格和标签背景设置为透明,以便仅显示时间/文本

发生的情况是:当标签背景是透明的(或直到通过设置Alpha使其足够不透明时,不透明为真),基础的上一次显示保持透明且不清晰

为了帮助解决这个问题,我整理了以下代码-时间和日期日历/etc被排除在外。这段代码只是我尝试过的许多代码的一个版本,有/没有不透明、调用的位置等等

区别在于动作监听器的使用——如果动作监听器被注释/删除,标签的显示会很好。取消对操作侦听器的注释,问题就会出现

看到图片…感谢您的帮助…谢谢

仅供参考-下面:代码sans导入和注释

带黑色背景的时钟屏幕截图

问题的屏幕截图:


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();
  }
}