>Java >java지도 시간 >OSX에서 반투명 Java 구성 요소의 다시 그리기 문제를 해결하는 방법은 무엇입니까?

OSX에서 반투명 Java 구성 요소의 다시 그리기 문제를 해결하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-24 20:06:47970검색

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

반투명 프레임 및 구성 요소 위에 다시 그리기

OSX의 Java에서는 반투명 창을 만들고 매초 텍스트를 업데이트하는 JLabel을 추가하면 다시 칠하는 데 문제가 발생합니다. 이 문제를 해결하려면 구성 요소의 다시 그리기 동작을 사용자 정의할 수 있습니다.

한 가지 해결책은 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를 통해 커스텀 페인팅 로직을 구현하고 투명도 효과를 사용하면 반투명에서 다시 페인팅 문제를 효과적으로 해결할 수 있습니다. OSX의 Java 구성요소.

위 내용은 OSX에서 반투명 Java 구성 요소의 다시 그리기 문제를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.