Java: Comment dessiner une bordure autour d'un JFrame non décoré?


J'ai actuellement la classe DropShadowBorder (qui étend la classe javax.swing.border.Border) de la bibliothèque SwingX, donc c'est une instance d'un Border régulier. Je voudrais dessiner cette bordure autour de mon JFrame non décoré. J'utilise actuellement la méthode suivante dans mon JFrame pour définir la bordure:

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

Remarque: J'utilise le volet racine du cadre pour dessiner la bordure, car le cadre ne prend pas en charge les bordures lui-même.

Le problème est que les bordures sont dessinées à l'intérieur du composant lui-même, comme vous pouvez le voir sur l'image ci-dessous, la bordure ombrée est dessinée à l'intérieur, contre les limites du cadre lui-même:

entrez la description de l'image ici

Remarque: La bordure (ombrée) est dessinée à l'intérieur du cadre contre ses limites, au lieu de l'extérieur du cadre.

Peu importe le type de bordure utilisé, tous sont dessinés à l'intérieur du JFrame lui-même.

Ma question est: Est-il possible de dessiner une bordure autour du cadre, pas seulement à l'intérieur contre le les limites de l'image?


Une façon qui pourrait être utilisée pour résoudre ce problème, est de créer une autre fenêtre plein écran non décorée qui est transparente, la fenêtre normale est placée au-dessus de celle-ci. Cette fenêtre plein écran est utilisée pour dessiner l'ombre, donc l'ombre n'a pas besoin d'être dessinée dans le cadre lui-même. C'est une solution pour obtenir un résultat similaire, c'est pas ce que je voudrais bien. Je veux dessiner une bordure en dehors du cadre. Ce genre de solutions habituellement causer d'autres problèmes.

Author: Tim Visée, 2013-11-23

3 answers

Oui, vous pouvez dessiner les bordures autour du JFrame non décoré. Obtenez simplement le volet racine du JFrame et définissez ses bordures par la méthode setBorder(Border border).

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

Par exemple:

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();
    }

} 

entrez la description de l'image ici

 14
Author: Hanzallah Afgan, 2014-09-09 02:20:32

JFrames et JDialogs sont les seules fenêtres (swing) qui doivent interagir avec le système de fenêtrage externe. Pour obtenir des ombres externes, vous avez besoin d'un contexte externe. Voir cette réponse sur la façon de l'obtenir:

Ombre JFrame non décorée

 1
Author: tucuxi, 2017-05-23 12:25:31

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

Certains looks Java peuvent fournir leur propre barre de titre, icônes et bordure de fenêtre. Si un look and feel prend en charge cette fonctionnalité, sa méthode getSupportsWindowDecorations( ) retournera true.

Vous devez donc implémenter votre propre apparence Java.

 0
Author: Robin Green, 2013-11-24 00:27:41