私は現在、DropShadowBorder
ライブラリからSwingX
クラス(javax.swing.border.Border
クラスを拡張)を持っているので、これは通常のBorder
のインスタンスです。装飾されていないJFrame
の周りにこの境界線を描きたいと思います。現在、JFrame
内で次のメソッドを使用して境界線を設定しています。
DropShadowBorder b = new DropShadowBorder(Color.BLACK, 0, 10, 0.2f, 10, true, true, true, true);
this.getRootPane().setBorder(b);
注:フレームは境界線自体をサポートしていないため、フレームのルートペインを使用して境界線を描画しています。
問題は、次の図に示すように、フレーム自体の境界に対して、影付きの境界線がコンポーネント自体の内部に描画されることです。
注:(影付きの)境界線は、フレームの外側ではなく、フレームの境界に対してフレームの内側に描画されます。
使用する境界線の種類は関係ありません。すべての境界線はJFrame
自体の内部に描画されます。
私の質問は:フレームの境界に対して内側だけでなく、フレームの周りに境界線を描くことは可能ですか?
この問題を解決するために使用できる1つの方法は、透明な別の装飾されていないフルスクリーンウィンドウを作成することです。通常のウィンドウはこのウィンドウの上に配置されます。このフルスクリーンウィンドウは影を描画するために使用されるため、フレーム自体に影を描画する必要はありません。これは同様の結果を得るための解決策ですが、これはnot私が望むものです。フレームの外側に境界線を描きたいです。これらの種類の解決策は通常、他の問題を引き起こします。
はい、装飾されていない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();
}
}
JFrameとJDialogは、外部ウィンドウシステムと対話する必要がある唯一の(スイング)ウィンドウです。 外部シャドウを取得するには、外部コンテキストが必要です。それを取得する方法については、この回答を参照してください。
から http://nadeausoftware.com/articles/2009/02/windows_Java_tip_how_control_window_decorations
一部のJavaルックアンドフィールは、独自のタイトルバー、アイコン、およびウィンドウ境界線を提供できます。ルックアンドフィールがこの機能をサポートしている場合、そのgetSupportsWindowDecorations()メソッドはtrueを返します。
したがって、独自のJavaルックアンドフィールを実装する必要があります。