我不確定這是否可行,但是有沒有辦法安全地讓彈出窗口變得半透明,即使父容器也是半透明的?
半透明窗口內的半透明JPopupMenu - 可選項?
如果不是,什麼是明智的替代使用或擴展替代JPopupMenu
?
注意:半透明是指不具有背景的組件,類似於setOpaque(false);
的效果。謝謝。
從論壇中回答用戶camickr 2009年:
我不知道,如果透明度畫1.6.0_10發生了變化。之前 ,我相信透明度只能在輕量級 組件(即Swing做所有的繪畫)中實現。 JFrame,JWindow和 JDialog不是輕量級的,因爲它們使用OS組件。
如果是彈出式窗口,則在其父框架內完全包含 時是輕量級的。但是一個輕量級的彈出框不能在框架的邊界之外被繪製爲 ,所以JWindow(我相信)被用作 彈出框,它不能透明。
SSCCE:顯示半透明的JWindow在半透明的JFrame
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);
}
}
我想這是可以實現的,在給定的情況下,您正在使用此功能可按做,用'JWindow' [setOpacity()](HTTP:// docs.oracle.com/javase/7/docs/api/java/awt/Window.html#setOpacity(float))。 –