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 Off:
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.
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