Maison >Java >javaDidacticiel >Pourquoi les JFrames non redimensionnables se chevauchent-ils lors de l'utilisation de Windows Aero ?

Pourquoi les JFrames non redimensionnables se chevauchent-ils lors de l'utilisation de Windows Aero ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-06 05:42:14866parcourir

Why Do Non-Resizable JFrames Overlap When Using Windows Aero?

Bordures et positionnement des fenêtres non redimensionnables

Dans les situations où des JFrames non redimensionnables sont utilisés et où Windows Aero est activé, le comportement de la méthode setLocation peut sembler incohérent lorsque l'on considère les bordures de fenêtre.

Pour illustrer ce comportement, considérons le code suivant extrait :

import java.awt.Rectangle;
import javax.swing.JFrame;
public class FrameBorders {
    public static void main(String[] args) {
        JFrame frame1 = new JFrame("frame 1");
        JFrame frame2 = new JFrame("frame 2");

        frame1.setResizable(false);
        frame2.setResizable(false);

        frame1.setVisible(true);       
        Rectangle bounds = frame1.getBounds();      
        frame2.setLocation(bounds.x + bounds.width, bounds.y);
        frame2.setVisible(true);
    }
}

Avec ce code, vous pouvez vous attendre à ce que frame2 soit positionné à droite de frame1. Cependant, lorsque Windows Aero est activé, les bordures des deux cadres se chevauchent.

Explication et solution

Windows Aero applique un style différent aux fenêtres non redimensionnables, ce qui entraîne une bordure plus épaisse. Étant donné que la méthode setLocation prend en compte les dimensions brutes de la fenêtre sans tenir compte de l'épaisseur de la bordure, elle positionne incorrectement les fenêtres, entraînant un problème de chevauchement.

Pour obtenir le comportement souhaité de deux cadres non redimensionnables positionnés côte à côte sans En superposant les bordures, vous pouvez :

  • Utiliser JDialogs à la place : Les JDialogs affichent généralement une bordure plus fine que JFrames. Dans l'exemple de code, remplacer frame2 par un JDialog résout le problème des bordures qui se chevauchent.
  • Désactiver Aero : Si l'utilisation de JDialogs n'est pas réalisable, vous pouvez désactiver les effets d'Aero en définissant la propriété système "sun .java2d.noddraw" sur "true". Cela peut améliorer la précision du positionnement des bordures.
  • Ajuster les limites manuellement : Déterminez l'épaisseur de bordure appropriée en fonction de votre plate-forme et ajustez manuellement les limites de la fenêtre pour la compenser. Cela nécessite des mesures et des tests minutieux pour garantir un positionnement correct sur différents systèmes.
  • Envisagez le fenêtrage natif : Les cadres de fenêtrage natifs, tels que AWT ou Swing, peuvent fournir un contrôle plus précis sur les bordures et le positionnement des fenêtres. que l'API standard de Java.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn