Heim > Java > javaLernprogramm > Hauptteil

Wie löse ich Repainting-Probleme in transluzenten Java-Komponenten unter OSX?

Susan Sarandon
Freigeben: 2024-11-24 20:06:47
Original
945 Leute haben es durchsucht

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

Neues Übermalen durchscheinender Rahmen und Komponenten

In Java unter OSX kann das Erstellen eines durchscheinenden Fensters und das Hinzufügen eines JLabel, das seinen Text jede Sekunde aktualisiert, möglich sein kann zu Problemen beim Neuanstrich führen. Um dieses Problem zu lösen, kann das Neuzeichnungsverhalten der Komponente angepasst werden.

Eine Lösung besteht darin, JLabel zu erweitern und Icon zu implementieren, um eine bessere Kontrolle über Transparenz und Neuzeichnung zu erhalten. Wie in der AlphaCompositeDemo zu sehen ist, können verschiedene Regelkombinationen angewendet werden, um den gewünschten Transparenzeffekt zu erzielen. In diesem Beispiel wird 100 % weißer Text auf einen 50 % schwarzen Hintergrund gelegt.

Alternativ können Sie den gesamten Rahmen durchscheinend machen, allerdings wird dadurch auch der Inhalt abgedunkelt. Dies kann erreicht werden, indem die Methode paintComponent() überschrieben wird, um die Transparenz anzupassen und den aktualisierten Inhalt korrekt zu zeichnen.

Hier ist ein Beispielcode-Snippet, das zeigt, wie man einen durchscheinenden Rahmen erstellt und undurchsichtigen Text darüber malt:

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());
    }
}
Nach dem Login kopieren

Durch die Implementierung einer benutzerdefinierten Mallogik und den Einsatz von Transparenzeffekten über AlphaComposite können Sie das Problem des Neumalens in durchscheinenden Java-Komponenten effektiv lösen OSX.

Das obige ist der detaillierte Inhalt vonWie löse ich Repainting-Probleme in transluzenten Java-Komponenten unter OSX?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage