2013-11-23 5 views
7

私は現在、SwingXライブラリからクラスを拡張しているDropShadowBorderクラスを持っています。したがって、これは通常の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ルックから

と、自分のタイトルバー、アイコン、ウィンドウの境界を提供することができます感じています。 Look&Feelがこの機能をサポートしている場合、そのgetSupportsWindowDecorations()メソッドはtrueを返します。

Java Look &フィールを実装する必要があります。

+0

すてきな記事ですが、これは非常に便利ですが、影を描く方法や、 'JFrame'の周りの他のボーダー。 –

1

JFramesとJDialogは、外部ウィンドウシステムと対話する必要がある唯一の(スイング)ウィンドウです。 外部の影を得るには、外部コンテキストが必要です。それを取得する方法についてこの回答を参照してください。

Undecorated JFrame shadow

+0

serval層を使用する必要がありますか?この例では、新しいコンテンツペインが作成され、すべてのフレームコンテンツが挿入されます。影はフレーム自体に描画されます。この方法を使用する必要がありますか?問題は、これがウィンドウの位置合わせとフルスクリーンの問題を非常に簡単に引き起こす可能性があることです。 –

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

私はあなたがそのことについて正しいと言う必要があります。私は私の質問で、フレームの周りに境界線を描画したいと思いましたが、この答えはルートペイントの周りに境界線を描画しますが、フレームの内側には残ります。だから、これは本当に私が恐れる問題を解決するものではありません。 –

関連する問題