JLabel保留以前的文本

时间:2013-08-06 23:11:16

标签: java swing opacity jlabel transparent

当花几分钟调整我的桌面时钟时,我发现了一个问题,我似乎无法在没有帮助的情况下解决...我读了一些类似问题的帖子,但解决方案对我不起作用。

时钟(带有动作侦听器和日历的典型java形式)工作得很好。 预期的调整:将Frame,ContentPane和Label背景设置为透明,只显示时间/文字

这会发生什么:当标签背景透明时(或者当不透明度为真时通过设置Alpha时它是不透明的),底层的先前显示保持不变并且不会清除。

为了帮助解决这个问题,我将以下代码放在一起 - 时间和日期排除日历内容/等。这个代码只是我尝试过/没有不透明,调用放置等等的许多版本。

使用动作侦听器有什么不同 - 如果动态侦听器被注释/删除,则标签显示正常。取消注释动作侦听器并发生问题。

查看图片...任何帮助表示感谢...谢谢!

fyi - 下面:代码没有导入和评论......

黑色bg时钟的截图 enter image description here

问题的屏幕截图:
enter image description here

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 个答案:

答案 0 :(得分:2)

Swing组件不适用于基于alpha的颜色。它们要么完全透明,要么完全不透明。

如果您指定某个组件为isOpaque,但使用半透明(Alpha)颜色填充它,则重绘管理器将不会更新组件后面的区域,而Graphics上下文将不会清理得当。请记住,Graphics上下文是共享资源,因此在组件之前绘制的所有内容仍将被绘制

您可以查看Java Swing Graphical Glitches Dealing with Transparency and Images了解详情。

然而。最简单的解决方案是创建TranslucentPane,从JPanel之类的扩展,使其透明(不透明),覆盖它的paintComponent方法并绘制半透明(alpha)颜色在其中。然后将标签添加到此。

查看Performing Custom PaintingPainting in AWT and Swing了解详情