これが可能かどうかはわかりませんが、親コンテナも半透明であってもポップアップを安全に半透明にする方法はありますか?
そうでない場合、代わりに使用または拡張する賢明な代替手段はJPopupMenu
何ですか?
注:半透明とは、 の効果と同様に、「背景を持たない」コンポーネントを指しますsetOpaque(false);
。ありがとう。
2009 年のユーザーcamickr
によるフォーラムの回答から:
1.6.0_10で透過塗装が変わったかどうかはわかりません。それ以前は、軽量コンポーネントでのみ透過性を実現できると考えています (つまり、Swing がすべての描画を行います)。JFrame、JWindow、および JDialog は、OS コンポーネントを使用するため軽量ではありません。
ポップアップの場合、親フレーム内に完全に含まれている場合は軽量です。しかし、軽量のポップアップはフレームの境界外に描画できないため、JWindow (私は信じています) がポップアップとして使用されますが、これは透過できません。
SSCCE:半透明の JFrame の上に半透明の JWindow を表示する
import com.sun.awt.AWTUtilities;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class OpaqueWindowSSCCE {
private int countdown = 5;
public static void main(String[] args) {
new OpaqueWindowSSCCE();
}
public OpaqueWindowSSCCE() {
final JFrame frame = new JFrame("OpaqueWindowSSCCE");
final JWindow window = new JWindow();
new Timer(1000, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(--countdown == 0){
frame.dispose();
window.dispose();
System.exit(0);
} else {
frame.repaint();
}
}
}).start();
frame.setContentPane(new JPanel() {
@Override
public void paintComponent(Graphics paramGraphics) {
super.paintComponent(paramGraphics);
Graphics2D g = (Graphics2D) paramGraphics.create();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(new Color(50, 50, 50));
g.fillRoundRect(0, 0, getWidth(), getHeight(), 10, 10);
g.setColor(new Color(180, 180, 180));
g.drawString("Closing in " + countdown + " seconds", 20, 25);
}
});
window.setContentPane(new JPanel() {
@Override
public void paintComponent(Graphics paramGraphics) {
super.paintComponent(paramGraphics);
Graphics2D g = (Graphics2D) paramGraphics.create();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(new Color(180, 180, 180));
g.fillRoundRect(0, 0, getWidth(), getHeight(), 10, 10);
}
});
frame.setUndecorated(true);
((JComponent) frame.getContentPane()).setOpaque(false);
((JComponent) window.getContentPane()).setOpaque(false);
AWTUtilities.setWindowOpaque(frame, false);
AWTUtilities.setWindowOpaque(window, false);
window.setAlwaysOnTop(true);
frame.setBounds(200,200,500,500);
window.setBounds(600,600,200,200);
frame.setVisible(true);
window.setVisible(true);
}
}