半透明のJFrameでJLabelのフォントサイズまたはコンテンツを変更し、フレームでpack()を呼び出すと、前のコンテンツのゴーストバージョンが表示されます。これはmacOSでのみ起こります。同じコードはWindows上で正常に動作します。フレームが再パックされたときに半透明のJFrameがレンダリングアーティファクトを残す
ここ問題を再現するためのコードです。 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);
});
}
}
。私は梱包後に内容ペインの再検証を試みました。これを解決するために私は何をする必要がありますか?
JavaはJava 7以降、透過的な背景をサポートしています。私の理解は、setOpacityは各ピクセルに対して一様な透過性を持ち、アルファレベルの色を持つsetBackgroundはピクセル単位の半透明性を有効にすることです。 –
@SteveMcLeod、JavaはSwingコンポーネントで透明な背景をサポートしていません。 JPanel、JCheckBoxなどのコンポーネントは、JFrameのような最上位コンポーネントとは異なります。 JPanelで透明度を設定しようとしています。 – camickr