2011-10-04 61 views
5

是的,這個問題無處不在。但是所有(工作)解決方案都使用AWTUtilities工具包,這是受限制的。Java - ol透明JFrame,不受限制libs

所以。我只想控制窗戶的不透明度。沒有必要塑造或不需要塗抹。只是一個透明的contentPane(簡單),和一個透明的JFrame背景(可笑困難)。

我可以發誓昨天我得到了正確的東西組合,但現在我似乎無法重現它。也有一些解決方案在那裏沒有使用AWTUtilities,但他們不工作...有人有一個很好的解決方案?

我的失敗代碼的例子:

public static void main(String[] args) { 
    JFrame test = new JFrame(); 
    test.setSize(400, 400); 
    test.setLocationRelativeTo(null); 
    test.setUndecorated(true); 
    test.setBackground(new Color(0, 0, 0, 0)); 
    test.getContentPane().setBackground(new Color(0,0,0,0)); 
    test.setVisible(true); 
} 

但這只是讓一個白色正方形。關閉,但沒有雪茄。我也嘗試覆蓋繪畫方法,並且有人在談論關於拋出Alpha通道的問題,但是這使它變成了黑色(當然)。所以...堆棧溢出它。

如果有確切的答案,請點我,然後馬上刪除。

更新 每在評論的請求,這裏是我是如何來到這裏的歷史記錄:

第一個環節大家到達是how to create translucent and shaped windows.這在類似的還有幾行」 ......幀半透明帶75%的不透明度。「所以......看起來他們的定義是一樣的,至少在那篇文章中。不幸的是他們使用圖書館。

我能追下去幾個鏈接:

非工作的「工作」的解決方案是在http://www.java-gaming.org/index.php?topic=24635.0報道這表明一些希望,但我無法得到它的工作。

http://techgearup.wordpress.com/2008/09/19/transparent-jframe-background/是一種使用屏幕截圖的黑客方式,並在其他幾個地方複製。

+3

你可以使用Java 7 PLZ回覆?你能鏈接到一些工作解決方案,以便我們看到你所嘗試過的嗎? –

+1

請不要[confound](http://stackoverflow.com/questions/3517722/java-transparent-jscrollpane/3518047#3518047)_opacity_和_transparency_。 – trashgod

+0

同意,這是Java 7的新功能之一:http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html –

回答

1

如果不使用Java v.6u10 +或調用本機代碼的第三方庫,則無法執行此操作。在Swing框架中,對話框和Windows被認爲是「頂級組件」,並在底層窗口系統中呈現。在Java v6u10之前,所有的頂級組件都有一個默認的,不透明的淺灰色背景,並且沒有辦法從Java代碼中改變它。

+0

顯然,自從2008年10月以來,Java 6u10就已經出現,這足以讓我的用戶擁有它。 Java 6u10之後的版本如何實現? – Ben

+0

在6u10中 - 您必須使用AWTUtilities,7之後他們將方法添加到Window和其他類。 http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#6u10(我知道你已經設置了AWTUtilities是「受限」的,但這基本上是Java爲你提供的唯一方法。 ) – Nate

+0

好的謝謝你的幫助。我正在開發一個開源項目,我不確定對不受限制文件的態度。但是,這是一個不同的問題:) – Ben

0

嘆息我遇到了同樣的問題,經過大量的時間處理後,我找到了一種方法在計算機上正確設置透明屏幕。但是,只要將框架設置爲透明,許多事情就會停止。如果你在任何地方使用JTextArea聲明,它立即停止工作。它甚至不會拋出一個錯誤!

所以這裏的代碼,希望這是一些使用。如果你犯了一個工作JScrollPane的吧:)

public class gui { 
    public frame f; 
    public String name = "Transparent?"; //name your frame * 
    public JButton exit = new JButton("Exit"); 
    public gui(){ //non-static context 
     f = new JFrame(name); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //* 
     f.setLocationRelativeTo(null); 
     f.setExtendedState(f.getExtendedState() | JFrame.MAXIMIZED_BOTH); 
     //maximizes window. if you dont want it, f.setSize(int, int) 
     f.setUndecorated(true); //necessary for setOpacity 
     f.setOpacity(.7f); //achieve trasparancy 
     f.setVisible(true); //show window 
     exit.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent arg0){ 
       System.exit(0); 
      } 
     }); 
     f.add(exit, BorderLayout.CENTER); 
     //since X is not available in the window, make a button to exit 
    } 

    public static void main(){ 
     new gui(); 
    } 
} 
//* Note: since the default Window manager is set off with setUndecorated(true), 
// the name and buttons won't really show. 
+0

哦,我忘了提及,JTextField仍然有效。目前爲止唯一不能使用的東西(我使用的東西)是JTextArea和JScrollPane 我還沒有測試邊界,但它不是主要問題 – nkazuko

+1

請學習java命名約定並堅持使用它們 – kleopatra