web-dev-qa-db-fra.com

JFrame: prenez la taille sans frontières?

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.

25
Tom

frame.getContentPane().getSize();
34
user489041
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()));
8
dwarfer88

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);
3
Gary

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.

0