半透明のフレームとコンポーネントの再描画
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 サイトの他の関連記事を参照してください。