it-swarm.com.de

JFrame: Größe ohne Grenzen bekommen?

Ist es in Java möglich, die Breite und Höhe des JFrames ohne Titel und andere Ränder abzurufen?

frame.getWidth () und frame.getHeight () 1 scheint die Breite einschließlich des Rahmens zurückzugeben.

Vielen Dank.

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

Das funktioniert gut

frame.getContentPane().getSize();

Nicht, wenn Sie noch keinen Inhalt hinzugefügt haben. In meinem Fall wollte ich vor dem Hinzufügen von Inhalten die inneren Abmessungen des JFrame berechnen, um den Inhalt entsprechend aufteilen zu können. Hier ist was ich mir ausgedacht habe.

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

Hier ist ein Codeausschnitt, der sowohl auf JFrame als auch auf AWTs Frame (was zufällig der Supertyp von JFrame ist) funktioniert:

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;
}

Achtung: Die Einsätze sind erst gültig, wenn der Frame angezeigt wurde.

Hier ist ein weiteres Codefragment, um dieses Problem zu umgehen:

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;
}

Dieser Code muss einmal mit einem sichtbaren Frame aufgerufen werden. Danach können die Einfügungen auch für unsichtbare Frames (aufgrund des Zwischenspeichers der defaultInsets) korrekt vorhergesagt werden, vorausgesetzt, sie sind immer gleich.

Das funktioniert natürlich nur, wenn alle Fenster die gleichen Fensterdekorationen erhalten. Ich kenne keinen Fall, in dem sie sich von Fenster zu Fenster unterscheiden könnten.

Das könnte auch nützlich sein:

frame.addWindowListener(new WindowAdapter() {

    @Override
    public void windowOpened(WindowEvent e) {
        MyUtilClass.getInsetsWithDefault(frame); // init the defaultInsets
    }

});

Sobald das Fenster sichtbar ist, ruft es die getInsetsWithDefault()-Methode auf und initialisiert das korrekte defaultInsets.