2013-11-23 104 views
7

我目前從SwingX庫中獲得DropShadowBorder類(它擴展了javax.swing.border.Border類),因此這是常規的Border的實例。我想圍繞我的未裝飾JFrame繪製此邊框。我目前使用我的JFrame內部下面的方法來設置邊框:Java:如何在未裝飾的JFrame周圍繪製邊框?

DropShadowBorder b = new DropShadowBorder(Color.BLACK, 0, 10, 0.2f, 10, true, true, true, true); 
this.getRootPane().setBorder(b); 

注:我使用的框架的根窗格上繪製邊界,因爲框架不支持邊界本身。

的問題是,在邊框組件本身的內部抽,你可以在圖片波紋管看到,陰影繪製邊框時內,靠着框架本身的界限:

enter image description here

注意:(陰影)邊框是在框架內部而不是框架外部繪製的。

使用什麼樣的邊框並不重要,它們都是在JFrame本身內部繪製的。

我的問題是:是否有可能在框架周圍繪製任何邊框,而不僅僅是在框架的邊界內?可以用來解決這個問題


的一種方式,是創建一個不同的未修飾的全屏窗口,它是透明的,正常的窗口放在這個上面。這個全屏窗口用於繪製陰影,所以陰影不需要在框架中繪製。這是獲得類似結果的解決方案,這是而不是但我想要的。我想在框架外畫一個邊框。這些解決方案通常會導致其他問題。

+1

'this.getContentPane()setBorder(B);',但更好的是有把'JPanel'用'Borders' – mKorbel

+0

'是有可能在框架本身周圍繪製任何邊框,而不是圍繞框架的根目錄?「 - 不。您嘗試解決什麼問題? – camickr

+0

我想爲未裝飾的JFrame添加陰影。我現在有一個邊框可以創建陰影,就像你在我的問題的圖片上看到的一樣。問題出在這些邊界上,它被繪製在組件的邊界被設置。例如,在該圖像上,邊框繪製在邊框的內側。有沒有辦法在框架的外部繪製這個陰影邊界? 注意:我已經更新了這個問題,使一切變得更加清晰。 –

回答

0

http://nadeausoftware.com/articles/2009/02/windows_java_tip_how_control_window_decorations

一些Java的外觀和感覺可以提供自己的標題欄,圖標和窗口邊框。如果外觀支持此功能,則其getSupportsWindowDecorations()方法將返回true。

所以你需要實現你自己的Java Look &感覺。

+0

不錯的文章,非常有用,但這並不能告訴我如何畫一個陰影,或者任何'JFrame'周圍的其他邊框。 –

1

JFrames和JDialogs是唯一需要與外部窗口系統進行交互的窗口。 要獲得外部陰影,您需要外部環境。參見如何得到它這樣的回答:

Undecorated JFrame shadow

+0

是否需要使用中間層?在該示例中,將創建一個新的內容窗格以放入所有的幀內容。陰影繪製在幀本身上。是否需要使用此方法,問題是這可能導致窗口對齊和全屏幕問題非常容易。 –

13

是的,你可以畫出周圍未修飾的JFrame的邊界。 只需獲取JFrame的根窗格並通過setBorder(Border border)方法設置其邊框。

getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.RED)); 

例如:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Borders2UndecoFrame extends JFrame{ 
    JLabel label = new JLabel("Welcome!", JLabel.CENTER); 
    public Borders2UndecoFrame(){ 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(new Dimension(200, 200)); 
     add(label, BorderLayout.CENTER); 
     setUndecorated(true); 
     getRootPane().setBorder(BorderFactory.createMatteBorder(4, 4, 4, 4, Color.RED)); 
     setVisible(true); 

    } 
    public static void main(String[] args) { 
     new Borders2UndecoFrame(); 
    } 

} 

enter image description here

+0

據我所知,這隻會縮小根窗格,因此它可以在框架本身內繪製邊框。對於某些情況來說,這可能是完美的,但對於陰影而言,它似乎並沒有很好地發揮作用。看看我放在問題中的圖片,這個例子顯示了我在說什麼。無論如何感謝您的答案和代碼示例! –

+0

是的,它真的會縮小rootPane,但通過添加邊框的大小來增加框架的大小。此外,你的問題不是關於影子,而是關於邊界。謝謝 –

+0

我不得不說,你說的是對的。我在我的問題中注意到我想在框架周圍繪製邊框,但是此答案在根窗格周圍繪製邊框,但仍然在框架內。所以這並不能真正解決我害怕的問題。 –

相關問題