bordure et positionnement de la fenêtre non redimensionnable

Si je crée des JFrames non redimensionnables et que Windows Aero est activé, setLocation ne semble pas prendre correctement en compte la bordure de la fenêtre.

Dans le code suivant, je m’attendrais à ce que la deuxième image soit positionnée à droite de la première image, au lieu de cela les bordures se chevauchent. Si Aero est désactivé ou si je supprime les appels à setResizable cela se fait comme prévu.

 import java.awt.Rectangle; import javax.swing.JFrame; public class FrameBorders { public static void main(Ssortingng[] 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); } } 

Est-ce que je fais quelque chose de mal ou est-ce un bug? Comment puis-je afficher 2 boîtes de dialog non exploitables côte à côte sans chevauchement des bordures?

Edit: ajout de captures d’écran (également changé frame2 en JDialog au lieu d’un JFrame)

Aero On: Aero On

Aero Off: Aero Off

Aero On mais redimensionnable: Aero On mais redimensionnable

Quels sont les problèmes avec les limites de parameters sur les conteneurs non redimensionnables?

Supposons que vous ajustez les limites pour bien paraître sur votre plate-forme. Supposons que la plate-forme de l’utilisateur ait une police avec différentes, disons plus grandes, FontMesortingcs . Cet exemple est quelque peu artificiel, mais vous avez l’idée. Si vous modifiez les limites d’un conteneur non redimensionnable, assurez-vous que le texte est visible, quelle que soit la police par défaut de la plate-forme hôte.

image

 import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; /** * @see http://stackoverflow.com/a/12532237/230513 */ public class Evil extends JPanel { private static final Ssortingng s = "Tomorrow's winning lottery numbers: 42, "; private JLabel label = new JLabel(s + "3, 1, 4, 1, 5, 9", JLabel.LEFT); public Evil() { this.add(label); } private void display() { JFrame f = new JFrame("Evil"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this, BorderLayout.WEST); f.pack(); int w = SwingUtilities.computeSsortingngWidth( label.getFontMesortingcs(label.getFont()), s); int h = f.getHeight(); f.setSize(w, h); f.setResizable(false); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(Ssortingng[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new Evil().display(); } }); } } 

Il semble que ce ne soit pas un problème Java, mais plutôt un problème d’application d’air, comme décrit ici .

Une solution que je vois en Java consiste à laisser les fenêtres être redimensionnables, puis à contourner le bogue setMaximumSize