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