2012-05-14 25 views
0

私はJFrameのサブクラスを持っています(JButton、Title、Jpanelを含んでいます)、JPanelを追加しました。 Jpanelはborderlayoutの中央部分を占めます。私はJPanelを透明にしたい(フレームウィンドウを通して見るべきである)。非透過コンポーネントをJava 1.5の透過JFrameに追加する方法は?

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

私は同じ結果でZオーダーを変更してJLayeredPaneを実験しました。

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

私もいくつかの経は、以前無し助けを借りて質問をした:ここで

Opaque components on transparent Java windows

Java: Transparent Windows with non-transparent components?

Re-paint on translucent frame/panel/component.

+0

JNAユーティリティを使用している場合、希望の不透明度を示すウィンドウにアルファマスクを設定して、希望する効果を得ることができるかもしれません。そして、不透明でないビットをオリジナルの重量コンポーネントに置きます窓。これがうまくいくかどうかは、透明性が与えられたプラットフォームのウィンドウ階層をカスケードする方法に大きく依存します。 – technomage

+0

ところで、JNAユーティリティは、グローバルウィンドウアルファ、ウィンドウビットマスク、およびアルファマスクの設定を提供します。最後は、あなたがしようとしていることのために働く可能性が最も高いです。以前のJVMで動作するjava [67]コードを取得する可能性は低いです。 – technomage

答えて

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

これは、望ましい結果をもたらすはずです。

コンテナを半透明またはその他の不透明度の組み合わせにする場合は、目的の結果を明確にする必要があります。

+1

お手伝いをしていただきありがとうございます...しかし、私は上記の方がうまくいかないと恐れています。あなたが知っているように、JButtonは軽量オブジェクトですが、それは祖先のウィンドウからアルファ値をとります。 –

+0

あなたの投稿を見ました:http://rabbit-hole.blogspot.in/2007/04/alpha-mask-transparency.html。その記事のソースコードのリンクを教えてください。そして、JNAでマスクが実際に何をするかに関する情報を提供してください。 –

+1

そのコードはJNAプロジェクトに含まれています。通常、ボタンのLAFはボタンのコンテンツ領域をペイントし、その背景ペイントをその親に残します。ボタンがコンテンツ領域を完全に塗りつぶしていない場合は、それを変更するか、またはsetOpaque(true)を使用して(デフォルトのbgを取得する)、または背景にペイントする親を与える必要があります。 – technomage

0

は、2つのラベルを持つ小さな例です。一方は完全に不透明であり、他方は半透明である。これはJPanelのと同様に動作することができますが、デモ-の目的のために、それはJLabelのと、よりexamplativeです:完全に透明な窓を開始する

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(); 
      } 
     }); 
    } 
} 
+0

返信いただきありがとうございます。私が言ったように、私はjava1.5(AWTUtilities.setWindowOpaqueメソッドを持たない)のアプリケーションをやりたかったので、依存関係librabriesとしてjre1.6u10のクラスを使用しようとしましたが、クラスの複製に問題がありますjre1.5。だから、何か他の選択肢があれば助けてくれます...... –

+0

@ user1371881あなたは運が忘れていると思います。この記事も参照してください:http://stackoverflow.com/questions/1416869/how-to-distribute-awtutilities –

+0

私はすでにその投稿を見ました...そして、クラスの名前を変更することによって依存関係を取り除くために私の一部を試みました。 jre1.6u10 wrt jre1.5には多くの変更があります。だから、私はそのプロセスをあきらめ、JNAのようなネイティブのライブラリの代替案を探しました(実際には役に立たない)。 www.screencast-o-matic.comのようないくつかのスクリーンキャプチャWEBSITEがありますが、これはjre1.5でも同じことをしています。それで何らかの方法があるはずです –

関連する問題