Maison >Java >javaDidacticiel >Pourquoi les JFrames non redimensionnables se chevauchent-ils lorsqu'ils sont positionnés côte à côte dans Java Swing avec Windows Aero activé ?
Positionnement des bordures de fenêtre et fenêtres non redimensionnables
Dans les applications Java Swing, lors de la création de JFrames non redimensionnables, la méthode setLocation peut ne pas fonctionner correctement Tenez compte de la bordure de la fenêtre si Windows Aero est activé. Cela conduit à des bordures de fenêtre qui se chevauchent lors du positionnement des fenêtres côte à côte.
Considérez le code suivant :
import java.awt.Rectangle; import javax.swing.JFrame; public class WindowBorders { 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); } }
Lors de l'utilisation de Windows Aero, frame2 serait positionné avec sa bordure chevauchant celle de frame1. Cependant, si Windows Aero est désactivé ou si les cadres sont configurés pour être redimensionnables, le positionnement fonctionne comme prévu.
Pour comprendre ce problème, considérez comment les conteneurs non redimensionnables sont gérés par le système d'exploitation. Lorsqu'une fenêtre n'est pas redimensionnable, le système d'exploitation détermine la taille minimale nécessaire au contenu de la fenêtre et à sa bordure. Cette taille minimale est ensuite appliquée et la fenêtre ne peut pas être réduite.
Dans notre code, le problème se pose car lorsque nous définissons l'emplacement du frame2 à l'aide de la méthode setLocation, nous spécifions la position de la fenêtre. le contenu, pas la bordure de la fenêtre. Cela signifie que la bordure du frame2 n'est pas prise en compte, ce qui entraîne des bordures qui se chevauchent.
Pour contourner ce problème, nous pouvons ajuster la position du frame2 pour tenir compte de sa bordure. Une façon de procéder consiste à soustraire la largeur de la bordure de la coordonnée X souhaitée :
frame2.setLocation(bounds.x + bounds.width - frame2.getInsets().right, bounds.y);
Cela garantit que la bordure du frame2 est correctement prise en compte et que les deux fenêtres sont positionnées côte à côte sans bordures qui se chevauchent.
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!