0

JFrame のサブクラス (JButton、Title、および Jpanel を含む) があり、それに JPanel を追加しました。JPanel は borderlayout の中央部分を占めます。JPanel を透明にしたい (フレーム ウィンドウを通して見えるようにする必要があります)。

私はJava 1.5でやっているので、JFrame.setOpacity(0.0f)を使ってJframeの透明度を設定しました。これにより、JFrame のすべてのコンポーネント (つまり、ボタン、タイトル、jPanel) が同じアルファ レベルを使用します。しかし、JPanel だけを透明にしたいのです。

Zオーダーを変更してJLayeredPaneを試してみましたが、同じ結果が得られました。

私は JNA (JNA windowsUtil も setOpacity() メソッドと同じことを行っています) のような外部ライブラリを使用し、java7 または java6 のクラスをアプリケーションの外部ライブラリとして使用することにオープンです。

私は以前に尋ねられたいくつかの質問を助けなしでやり遂げました:

透明な Java ウィンドウ上の不透明なコンポーネント

Java: 非透過コンポーネントを含む透過 Windows?

半透明のフレーム/パネル/コンポーネントに再塗装します。

4

2 に答える 2

1

JNA のWindowUtils.setWindowTransparent()方法を使用して、完全に透明なウィンドウから始めます。そのウィンドウに描画されたピクセルは、アルファ コンポーネントが保持されます。

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

以下は、2 つのラベルを使用した小さな例です。一方は完全に不透明で、もう一方は半透明です。これは 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 に答える