【发布时间】:2012-05-18 15:51:04
【问题描述】:
我不确定这是否可行,但有没有办法安全地允许弹出窗口是半透明的,即使父容器也是半透明的?
如果不是,什么是使用或扩展而不是 JPopupMenu 的明智选择?
注意:半透明指的是没有“背景”的组件,类似于setOpaque(false);的效果。谢谢。
来自用户 camickr 在 2009 年的论坛回答:
不知道1.6.0_10透明画有没有变化。事先的 对此,我相信只有轻量级才能实现透明 组件(即 Swing 完成所有绘画)。 JFrame、JWindow 和 JDialog 不是轻量级的,因为它们使用操作系统组件。
在弹出窗口的情况下,完全包含时它是轻量级的 在其父框架内。但是不能绘制轻量级的弹出窗口 在框架的范围之外,因此使用 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);
}
}
【问题讨论】:
-
我想这可以通过
JWindow使用此功能setOpacity() 在给定的上下文中实现。
标签: java swing awt translucency