En Java, est-il possible d'obtenir la largeur et la hauteur du JFrame sans le titre et les autres bordures?
frame.getWidth () et frame.getHeight () 1 semblent renvoyer la largeur, bordure comprise.
Merci.
frame.getContentPane().getSize();
frame.pack();
System.out.println("frame width : "+getWidth());
System.out.println("frame height: "+getHeight());
System.out.println("content pane width : "+getContentPane().getWidth());
System.out.println("content pane height: "+getContentPane().getHeight());
System.out.println("width of left + right borders: "+(getWidth()-getContentPane ().getWidth()));
System.out.println("height of top + bottom borders: "+(getHeight()-getContentPane().getHeight()));
Cela fonctionne bien
frame.getContentPane().getSize();
Mais pas si vous n'avez pas encore ajouté de contenu. Dans mon cas, je voulais calculer les dimensions intérieures du cadre JFrame avant d'ajouter du contenu afin de pouvoir le diviser en conséquence. Voici ce que je suis venu avec.
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
pack(); // Need this, otherwise insets() show as 0.
int scrW = (int)screenSize.getWidth();
int scrH = (int)screenSize.getHeight();
int innerW = scrW - getInsets().left - getInsets().right;
int innerH = scrH - getInsets().top - getInsets().bottom;
// Need to setSize(), otherwise pack() will collapse the empty JFrame
setSize(scrW, scrH);
Voici un extrait de code qui fonctionne sur JFrame
ainsi que sur la Frame
d'AWT (qui se trouve être le super-type de JFrame):
public static Dimension getInnerSize(Frame frame) {
Dimension size = frame.getSize();
Insets insets = frame.getInsets();
if (insets != null) {
size.height -= insets.top + insets.bottom;
size.width -= insets.left + insets.right;
}
return size;
}
Attention: les incrustations ne sont valables que lorsque le cadre a été affiché.
Voici un autre extrait de code permettant de contourner ce problème:
private static Insets defaultInsets;
public static Insets getInsetsWithDefault(Frame frame) {
// insets only correct after pack() and setVisible(true) has been
// called, so we use some fallback strategies
Insets insets = frame.getInsets();
if (insets.top == 0) {
insets = defaultInsets;
if (insets == null) {
insets = new Insets(26, 3, 3, 3);
// usual values for windows as our last resort
// but only as long as we never saw any real insets
}
} else if (defaultInsets == null) {
defaultInsets = (Insets) insets.clone();
}
return insets;
}
Ce code doit être appelé une fois avec un cadre visible. Après cela, il est possible de prédire correctement les incrustations, même pour les images invisibles (en raison de la mise en cache de la variable defaultInsets
), à condition qu'elles soient toujours identiques.
Bien sûr, cela ne fonctionne que si toutes les fenêtres ont les mêmes décorations. Mais je ne suis au courant d'aucun cas où ils pourraient différer d'une fenêtre à l'autre.
Cela pourrait être utile aussi:
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
MyUtilClass.getInsetsWithDefault(frame); // init the defaultInsets
}
});
Il appellera la méthode getInsetsWithDefault()
une fois la fenêtre visible et initialisera la bonne variable defaultInsets
.