Maison >Java >javaDidacticiel >Comment résoudre les problèmes de repeinture dans les composants Java translucides sur OSX ?

Comment résoudre les problèmes de repeinture dans les composants Java translucides sur OSX ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-24 20:06:47972parcourir

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

Repeindre sur des cadres et des composants translucides

En Java sur OSX, créer une fenêtre translucide et ajouter un JLabel qui met à jour son texte toutes les secondes peut entraîner des problèmes de repeinture. Pour résoudre ce problème, le comportement de repeinture du composant peut être personnalisé.

Une solution consiste à étendre JLabel et à implémenter Icon pour obtenir un meilleur contrôle sur la transparence et le redessin. Comme le montre AlphaCompositeDemo, diverses combinaisons de règles peuvent être appliquées pour obtenir l'effet de transparence souhaité. Dans cet exemple, un texte 100 % blanc est superposé sur un fond noir à 50 %.

Vous pouvez également rendre l'ensemble du cadre translucide, même si cela assombrit également le contenu. Ceci peut être réalisé en remplaçant la méthode paintComponent() pour ajuster la transparence et dessiner correctement le contenu mis à jour.

Voici un exemple d'extrait de code qui montre comment créer un cadre translucide et peindre du texte opaque dessus :

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

En implémentant une logique de peinture personnalisée et en utilisant des effets de transparence via AlphaComposite, vous pouvez résoudre efficacement le problème de repeinture dans les composants Java translucides sur OSX.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn