2016-11-08 4 views
0

半透明のJFrameでJLabelのフォントサイズまたはコンテンツを変更し、フレームでpack()を呼び出すと、前のコンテンツのゴーストバージョンが表示されます。これはmacOSでのみ起こります。同じコードはWindows上で正常に動作します。フレームが再パックされたときに半透明のJFrameがレンダリングアーティファクトを残す

はここで何が起こるかを拡大した例です: enter image description here

ここ

問題を再現するためのコードです。 JFrameのが良い問題を参照するには、白い背景の上にあることを確認し、その後、「ビガー」と「小規模」ボタンをクリックしてください:私は不透明にすべてのコンポーネントを変更しようとした

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 

public class ScratchSpace { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      JFrame frame = new JFrame("Test Transparent Frame"); 
      frame.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", true); 
      frame.setUndecorated(true); 
      frame.setBackground(new Color(0, 0, 0, 25)); 

      JPanel contentPane = new JPanel(new FlowLayout()); 
      contentPane.setOpaque(false); 
      contentPane.setBackground(new Color(0, 0, 0, 25)); 

      JLabel label = new JLabel("Hello cruel world"); 
      label.setForeground(Color.WHITE); 
      contentPane.add(label); 

      contentPane.add(new JButton(new AbstractAction("Bigger") { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        label.setFont(label.getFont().deriveFont(label.getFont().getSize() + 1f)); 
        frame.pack(); 
       } 
      })); 
      contentPane.add(new JButton(new AbstractAction("Smaller") { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        label.setFont(label.getFont().deriveFont(label.getFont().getSize() - 1f)); 
        frame.pack(); 
       } 
      })); 

      frame.setContentPane(contentPane); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
     }); 
    } 
} 

。私は梱包後に内容ペインの再検証を試みました。これを解決するために私は何をする必要がありますか?

答えて

0

スイングは透明な背景を適切にペイントする方法を知らないので、自分でペイントする必要があります。

詳細と解決方法についてはBackground With Transparencyをご覧ください。

フレームを透明に設定するには、フレームのsetOpacity(...)メソッドを使用する必要があります。 How to Create Translucent WindowsのSwingチュートリアルのセクションをチェックしてください。

+0

JavaはJava 7以降、透過的な背景をサポートしています。私の理解は、setOpacityは各ピクセルに対して一様な透過性を持ち、アルファレベルの色を持つsetBackgroundはピクセル単位の半透明性を有効にすることです。 –

+0

@SteveMcLeod、JavaはSwingコンポーネントで透明な背景をサポートしていません。 JPanel、JCheckBoxなどのコンポーネントは、JFrameのような最上位コンポーネントとは異なります。 JPanelで透明度を設定しようとしています。 – camickr

関連する問題