0

我有一个 JFrame 的子类(它包含 JButton、Title 和 Jpanel),我向它添加了一个 JPanel。Jpanel 占据边界布局的中心部分。我想让 JPanel 透明(它应该通过 Frame 窗口看到)。

正如我为 Java 1.5 所做的那样,我使用 JFrame.setOpacity(0.0f) 来设置 Jframe 的透明度。通过这样做,JFrame 的所有组件(即按钮、标题和 jPanel)都使用相同的 alpha 级别。但我只希望 JPanel 是透明的。

我通过改变 Z 顺序来试验 JLayeredPane,结果相同。

我愿意使用 JNA 之类的外部库(JNA windowsUtil 也与 setOpacity() 方法相同)并使用 java7 或 java6 的类作为我的应用程序的外部库。

我什至在没有帮助的情况下解决了一些以前提出的问题:

透明 Java 窗口上的不透明组件

Java:带有非透明组件的透明 Windows?

在半透明框架/面板/组件上重新绘制。

4

2 回答 2

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"));

这应该会产生预期的结果。

如果您希望您的容器是半透明的,或其他不透明组合,您需要阐明您想要的结果。

于 2012-05-16T18:02:43.560 回答
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();
            }
        });
    }
}
于 2012-05-14T09:11:38.897 回答