簡體   English   中英

如何在Java 1.5中向非透明JFrame添加非透明組件?

[英]How to add non-Transparent components to Transparent JFrame in java 1.5?

我有一個JFrame的子類(它包含JButton,Title和Jpanel),並且向其添加了一個JPanel。 Jpanel占據borderlayout的中心部分。 我想使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?

在半透明框架/面板/組件上重新繪畫。

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

這樣應該可以達到預期的效果。

如果您希望容器是半透明的或其他不透明的組合,則需要澄清所需的結果。

這是一個帶有兩個標簽的小示例。 一個是完全不透明的,而另一個則是半透明的。 這在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();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM