반투명 프레임 및 구성 요소 위에 다시 그리기
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!