我有一个JFrame的子类(它包含JButton,Title和Jpanel),我添加了一个JPanel。 Jpanel占据了边界布局的中心部分。我想让JPanel变得透明(它应该通过Frame窗口看到)。
正如我在Java 1.5中所做的那样,我使用JFrame.setOpacity(0.0f)来设置Jframe的透明度。通过这样做,JFrame的所有组件(即按钮,标题ahd jPanel)使用相同的alpha级别。但我只希望JPanel是透明的。
我通过改变Z-order来实验JLayeredPane,结果相同。
我愿意使用像JNA这样的外部库(JNA windowsUtil也和setOpacity()方法一样),并使用java7或java6类作为我的应用程序的外部库。
我甚至在没有帮助的情况下经历过一些先前提出的问题:
Opaque components on transparent Java windows
答案 0 :(得分:1)
使用JNA的WindowUtils.setWindowTransparent()
方法开始一个完全透明的窗口。绘制到该窗口的任何像素都将保留其alpha分量。
JFrame f = ...
WindowUtils.setWindowTransparent(f, true);
// ensure JPanel content pane doesn't paint its (solid) background
f.getContentPane().setOpaque(false);
// Any other added components will be painted normally
f.getContentPane().add(new JButton("I'm opaque"));
这应该会产生预期的效果。
如果您希望容器为半透明或其他不透明度组合,则需要澄清所需的结果。
答案 1 :(得分:0)
这是一个带有两个标签的小例子。一个是完全不透明的,另一个是半透明的。这可以与JPanel一起使用,但出于演示目的,它更适用于JLabel:
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import com.sun.awt.AWTUtilities;
public class Test3 {
protected static void initUI() {
JFrame frame = new JFrame("test");
frame.setUndecorated(true);
AWTUtilities.setWindowOpaque(frame, false);
JLabel label = new JLabel("Hello NOT transparent label");
label.setOpaque(true);
label.setBackground(new Color(255, 0, 0));
JLabel transLabel = new JLabel("Hello transparent label");
transLabel.setOpaque(true);
transLabel.setBackground(new Color(255, 0, 0, 50));
frame.setLocationByPlatform(true);
frame.getContentPane().add(label);
frame.getContentPane().add(transLabel, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initUI();
}
});
}
}