2012-05-05 121 views
1

我已經成功地讓java窗口透明,但是我在將不透明的組件添加到這些窗口上方時遇到了麻煩。 JFrame.setOpacity(0)和AWTUtilities setWindowOpacity都將透明度轉換爲構成組件。另外,JFrame.setBackground(0,0,0,0)以某種方式向所述組件泄露透明度。透明Java窗口上的不透明組件

我該如何解決這個問題?

測試類:透明背景,setOpacity和AWTUtility,分別

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import java.awt.Color; 

public class test { 
public static void main(String[] args){ 
JFrame frame = new JFrame("test"); 
JLabel label = new JLabel("Label text"); 
frame.setUndecorated(true); 
frame.setBackground(new Color(0,0,0,128)); 
frame.add(label); 
frame.pack(); 
frame.setVisible(true); 
} 
} 


public class test2 { 

public static void main(String[] args){ 
JFrame frame = new JFrame("test"); 
JLabel label = new JLabel("Label text"); 
frame.setUndecorated(true); 
frame.setOpacity(.50f); 
frame.add(label); 
frame.pack(); 
frame.setVisible(true); 
} 
} 


import com.sun.awt.AWTUtilities; 
import java.lang.reflect.Method; 
import java.awt.Window; 

public class test3 { 
public static void main(String[] args){ 
JFrame frame = new JFrame("test"); 
JLabel label = new JLabel("Label text"); 
frame.setUndecorated(true); 

try { 
Class<?> awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities"); 
Method mSetWindowOpacity = awtUtilitiesClass.getMethod("setWindowOpacity", Window.class, float.class); 
mSetWindowOpacity.invoke(null, frame, Float.valueOf(0.50f)); 
} catch (Exception x){}  

frame.add(label); 
frame.pack(); 
frame.setVisible(true); 
} 
} 

編輯:我試過的setBackground(0,0,0,0)在Windows上,它的工作原理,但它不」 t在Linux(xfce)上正常工作。

+0

爲了更好地幫助越早,張貼[SSCCE](http://sscce.org/)。 –

回答

0

使用AWTUtilties.setOpaque(Window,boolean),你可以得到你想要的。這裏是一個半透明標籤的一個例子(紅色背景):

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"); 
     JLabel label = new JLabel("Label text"); 
     label.setOpaque(true); 
     label.setBackground(new Color(255, 0, 0, 128)); 
     frame.setUndecorated(true); 

     AWTUtilities.setWindowOpaque(frame, false); 
     frame.add(label); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 

下面是一些截圖與用於阿爾法通道(在白色背景上製造)不同的值:

阿爾法設置爲128(半透明):

Half-transparent label

阿爾法設置爲0(完全透明):

Completely transparent label

阿爾法設置爲255(完全不透明):

Completely opaque

+0

在我的電腦上,這個例子的標籤是部分透明的,即使我把alpha設置爲0,即使它不應該。我似乎無法得到任何工作,我開始認爲這是因爲我使用的平臺。 – septette

+0

@septette我用不同的截圖更新了我的帖子,背景色的Alpha值設置爲不同的值。我的配置(這裏)是帶有JDK7的WinXP(但我確信它可以在JDK6上運行,至少是最新版本) –