1

デスクトップの時計を微調整するのに数分費やしたとき、助けなしでは解決できないと思われる問題を発見しました... 同様の問題に関するいくつかの投稿を読みましたが、解決策はうまくいきませんでした。

時計 (アクション リスナーとカレンダーを備えた典型的な Java 形式) は問題なく動作します。 意図した微調整: Frame、ContentPane、および Label の背景を透明に設定して、時間/テキストのみが表示されるようにします

何が起こるか:ラベルの背景が透明の場合 (または、Opaque が true のときに Alpha を設定して十分に不透明になるまで)、下にある以前の表示はそのままで、クリアされません。

これを理解するために、次のコードをまとめました - 時刻と日付のカレンダーなどは除外されています。このコードは、不透明度、呼び出しの配置などを使用して/使用せずに試した多くのバージョンの 1 つにすぎません。

違いを生むのは、アクション リスナーの使用です。アクション リスナーがコメント化または削除されている場合、ラベルの表示は問題ありません。アクション リスナーのコメントを外すと、問題が発生します。

画像を見てください…どんな助けも感謝します…ありがとう!

参考までに-以下:コードはインポートとコメントを除きます...

黒い背景の時計のスクリーンショット
ここに画像の説明を入力

問題のスクリーンショット:
ここに画像の説明を入力

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

1 に答える 1

2

Swing コンポーネントは、アルファ ベースの色ではうまく機能しません。それらは完全に透明または完全に不透明です。

コンポーネントがisOpaqueであることを指定しても、半透明 (アルファ) 色を使用して塗りつぶすと、再描画マネージャーはコンポーネントの背後の領域を更新せず、Graphicsコンテキストが適切にクリアされません。コンテキストGraphicsは共有リソースであるため、コンポーネントの前に描画されたものはすべて描画されます。

詳細については、Java Swing Graphical Glitches Dealing with Transparency and Imagesを参照してください。

でも。最も簡単な解決策は、 を作成しTranslucentPane、 のようなものから拡張し、JPanel透明 (不透明ではない) にし、そのメソッドをオーバーライドしpaintComponent、その中から半透明 (アルファ) 色をペイントすることです。次に、これにラベルを追加します。

詳細については、カスタム ペインティングの実行AWT および Swingでのペインティングを参照してください。

于 2013-08-06T23:45:11.910 に答える