OSX 上の半透明 Java コンポーネントの再描画の問題を解決するには?

Susan Sarandon
リリース: 2024-11-24 20:06:47
オリジナル
945 人が閲覧しました

How to Solve Repainting Issues in Translucent Java Components on OSX?

半透明のフレームとコンポーネントの再描画

OSX 上の Java では、半透明のウィンドウを作成し、テキストを毎秒更新する JLabel を追加すると、再塗装時に問題が発生します。この問題を解決するには、コンポーネントの再描画動作をカスタマイズできます。

解決策の 1 つは、JLabel を拡張し、Icon を実装して、透明性と再描画をより詳細に制御することです。 AlphaCompositeDemo で見られるように、さまざまなルールの組み合わせを適用して、目的の透明効果を実現できます。この例では、100% の白いテキストが 50% の黒い背景にオーバーレイされています。

あるいは、フレーム全体を半透明にすることもできますが、これによりコンテンツも暗くなります。これは、paintComponent() メソッドをオーバーライドして透明度を調整し、更新されたコンテンツを正しく描画することで実現できます。

これは、半透明のフレームを作成し、その上に不透明なテキストをペイントする方法を示すサンプル コード スニペットです。

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class TranslucentFrame extends JPanel implements ActionListener {

    // Frame configurations
    private static final int W = 300;
    private static final int H = 100;
    private static final Font FONT = new Font("Serif", Font.PLAIN, 48);
    private static final SimpleDateFormat DF = new SimpleDateFormat("HH:mm:ss");
    private final Date NOW = new Date();
    private final Timer TIMER = new Timer(1000, this);
    private BufferedImage TIME;
    private Graphics2D TIMEG;

    public TranslucentFrame() {
        super(true);
        setPreferredSize(new Dimension(W, H));
        TIMER.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D G2D = (Graphics2D) g;
        G2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        int W = getWidth();
        int H = getHeight();
        G2D.setComposite(AlphaComposite.Clear);
        G2D.fillRect(0, 0, W, H);
        G2D.setComposite(AlphaComposite.Src);
        G2D.setPaint(getBackground());
        G2D.fillRect(0, 0, W, H);
        renderTime(G2D);
        int W2 = TIME.getWidth() / 2;
        int H2 = TIME.getHeight() / 2;
        G2D.setComposite(AlphaComposite.SrcOver);
        G2D.drawImage(TIME, W / 2 - W2, H / 2 - H2, null);
    }

    private void renderTime(Graphics2D G2D) {
        G2D.setFont(FONT);
        String S = DF.format(NOW);
        FontMetrics FM = G2D.getFontMetrics();
        int W = FM.stringWidth(S);
        int H = FM.getHeight();
        if (TIME == null && TIMEG == null) {
            TIME = new BufferedImage(W, H, BufferedImage.TYPE_INT_ARGB);
            TIMEG = TIME.createGraphics();
            TIMEG.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            TIMEG.setFont(FONT);
        }
        TIMEG.setComposite(AlphaComposite.Clear);
        TIMEG.fillRect(0, 0, W, H);
        TIMEG.setComposite(AlphaComposite.Src);
        TIMEG.setPaint(Color.GREEN);
        TIMEG.drawString(S, 0, FM.getAscent());
    }

    private static void create() {
        JFrame F = new JFrame();
        F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        F.setBackground(new Color(0f, 0f, 0f, 0.3f));
        F.setUndecorated(true);
        F.add(new TranslucentFrame());
        F.pack();
        F.setLocationRelativeTo(null);
        F.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent E) {
        NOW.setTime(System.currentTimeMillis());
        repaint();
    }

    public static void main(String[] ARGS) {
        EventQueue.invokeLater(() -> create());
    }
}
ログイン後にコピー

カスタム ペイント ロジックを実装し、AlphaComposite による透明効果を採用することで、半透明の Java コンポーネントの再ペイントの問題を効果的に解決できます。 OSX。

以上がOSX 上の半透明 Java コンポーネントの再描画の問題を解決するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート