web-dev-qa-db-ja.com

Java:装飾されていないJFrameの周りに境界線を描く方法は?

私は現在、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);

注:フレームは境界線自体をサポートしていないため、フレームのルートペインを使用して境界線を描画しています。

問題は、次の図に示すように、フレーム自体の境界に対して、影付きの境界線がコンポーネント自体の内部に描画されることです。

enter image description here

注:(影付きの)境界線は、フレームの外側ではなく、フレームの境界に対してフレームの内側に描画されます。

使用する境界線の種類は関係ありません。すべての境界線はJFrame自体の内部に描画されます。

私の質問は:フレームの境界に対して内側だけでなく、フレームの周りに境界線を描くことは可能ですか?


この問題を解決するために使用できる1つの方法は、透明な別の装飾されていないフルスクリーンウィンドウを作成することです。通常のウィンドウはこのウィンドウの上に配置されます。このフルスクリーンウィンドウは影を描画するために使用されるため、フレーム自体に影を描画する必要はありません。これは同様の結果を得るための解決策ですが、これはnot私が望むものです。フレームの外側に境界線を描きたいです。これらの種類の解決策は通常、他の問題を引き起こします。

7
Tim Visée

はい、装飾されていない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

17
Hanzallah Afgan

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

装飾されていないJFrameシャドウ

1
tucuxi

から http://nadeausoftware.com/articles/2009/02/windows_Java_tip_how_control_window_decorations

一部のJavaルックアンドフィールは、独自のタイトルバー、アイコン、およびウィンドウ境界線を提供できます。ルックアンドフィールがこの機能をサポートしている場合、そのgetSupportsWindowDecorations()メソッドはtrueを返します。

したがって、独自のJavaルックアンドフィールを実装する必要があります。

0
Robin Green