it-swarm.com.de

Warum setzt die JFrame-Methode setSize () die Größe nicht korrekt?

Also habe ich seit ungefähr einem Semester in Java programmiert, und ich hatte dieses Problem ein paar Mal und kam schließlich zum Nachfragen.

Wenn ich eine JFrame mache und dann die Größe setze, wie zum Beispiel setSize(400,800). Der Frame ist nicht wirklich 800 pixels lang. Von dem, was ich sagen kann, ist es eigentlich eher 770 (or maybe 769) pixels lang. Wenn Sie die vertikale Größe auf einen sehr niedrigen Wert (unter 30) setzen, wird der Rahmen nicht einmal angezeigt. Lediglich die obere Fensterleiste des Betriebssystems und der Rahmen werden nicht größer, bis Sie einen Wert über 30 einstellen (also setSize(400,0) sieht genauso aus wie setSize(400,20)). Warum ist das nicht schwer zu beheben, aber es ist komisch und ich bin neugierig, warum das so ist?

Wenn Sie mehr Informationen benötigen, fragen Sie einfach und ich werde es Ihnen besorgen. 

16
convergedtarkus

Dies liegt wahrscheinlich daran, dass die Größe eines Rahmens die Größe des Rahmens umfasst.

Ein Frame ist ein Fenster der obersten Ebene mit einem Titel und einem Rand. Die Größe des Rahmens umfasst alle Bereiche, die für den Rand bestimmt sind. Die Abmessungen des Randbereichs können mit der getInsets-Methode ermittelt werden. Da der Randbereich in der Gesamtgröße des Rahmens enthalten ist, verdeckt der Rand effektiv einen Teil des Rahmens, wodurch der zum Rendern und/oder Anzeigen von Unterkomponenten verfügbare Bereich auf das Rechteck beschränkt wird, das eine Position in der oberen linken Ecke (Einfügungen) hat. left, insets.top) und hat eine Größe der Breite - (insets.left + insets.right) nach Höhe - (insets.top + insets.bottom). 

Quelle: http://download.Oracle.com/javase/tutorial/uiswing/components/frame.html

12
Kyle

JFrame SetSize () enthält den Bereich + Rand.

Ich denke, Sie müssen die Größe von ContentPane davon einstellen

jFrame.getContentPane().setSize(800,400);

Ich rate Ihnen daher, JPanel zu verwenden, das in einen JFrame eingebettet ist, und Sie ziehen auf dieses JPanel zurück. Dies würde Ihr Problem minimieren.

JFrame jf = new JFrame();
JPanel jp = new JPanel();
jp.setPreferredSize(new Dimension(400,800));// changed it to preferredSize, Thanks!
jf.getContentPane().add( jp );// adding to content pane will work here. Please read the comment bellow.
jf.pack();

Ich lese das aus Javadoc

Die Klasse JFrame ist leicht inkompatibel mit Frame. Wie alle anderen JFC/Swing-Container der obersten Ebene enthält ein JFrame ein JRootPane als einziges untergeordnetes Element . Das Inhaltsfenster , das vom Stammfenster bereitgestellt wird, sollte in der Regel alle Nicht-Menükomponenten enthalten, die vom JFrame angezeigt werden. Dies unterscheidet sich vom AWT-Rahmengehäuse. Um beispielsweise einem AWT-Frame, den Sie schreiben, ein untergeordnetes Element hinzuzufügen, gehen Sie wie folgt vor:

frame.add(child);

Wenn Sie jedoch JFrame verwenden, müssen Sie das untergeordnete Element zum Inhaltsbereich von JFrame hinzufügen:

frame.getContentPane().add(child);

19

Unter OS X müssen Sie vorhandene Fensterdekorationen berücksichtigen. Sie erhöhen die Höhe um 22 Pixel. Auf einem JFrame müssen Sie dem Programm Folgendes mitteilen:

frame.setSize(width, height + 22);
1
ben

Es gibt viele gute Gründe, die Größe eines Rahmens festzulegen. Erinnern Sie sich an die letzte vom Benutzer eingestellte Größe und stellen Sie diese Einstellungen wieder her. Ich habe diesen Code, der für mich zu funktionieren scheint:

package javatools.swing;
import Java.util.prefs.*;
import Java.awt.*;
import Java.awt.event.*;

import javax.swing.JFrame;

public class FramePositionMemory {
    public static final String WIDTH_PREF = "-width";

    public static final String HEIGHT_PREF = "-height";

    public static final String XPOS_PREF = "-xpos";

    public static final String YPOS_PREF = "-ypos";
    String prefix;
    Window frame;
    Class<?> cls;

    public FramePositionMemory(String prefix, Window frame, Class<?> cls) {
        this.prefix = prefix;
        this.frame = frame;
        this.cls = cls;
    }

    public void loadPosition() {
        Preferences prefs = (Preferences)Preferences.userNodeForPackage(cls);
    //  Restore the most recent mainframe size and location
        int width = prefs.getInt(prefix + WIDTH_PREF, frame.getWidth());
        int height = prefs.getInt(prefix + HEIGHT_PREF, frame.getHeight());
        System.out.println("WID: " + width + " HEI: " + height);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int xpos = (screenSize.width - width) / 2;
        int ypos = (screenSize.height - height) / 2;
        xpos = prefs.getInt(prefix + XPOS_PREF, xpos);
        ypos = prefs.getInt(prefix + YPOS_PREF, ypos);
        frame.setPreferredSize(new Dimension(width, height));
        frame.setLocation(xpos, ypos);
        frame.pack();
    }

    public void storePosition() {
        Preferences prefs = (Preferences)Preferences.userNodeForPackage(cls);
        prefs.putInt(prefix + WIDTH_PREF, frame.getWidth());
        prefs.putInt(prefix + HEIGHT_PREF, frame.getHeight());
        Point loc = frame.getLocation();
        prefs.putInt(prefix + XPOS_PREF, (int)loc.getX());
        prefs.putInt(prefix + YPOS_PREF, (int)loc.getY());
        System.out.println("STORE: " + frame.getWidth() + " " + frame.getHeight() + " " + loc.getX() + " " + loc.getY());
    }
}
public class Main {
void main(String[] args) {
        JFrame frame = new Frame();
        // SET UP YOUR FRAME HERE.
        final FramePositionMemory fm = new FramePositionMemory("scannacs2", frame, Main.class);
        frame.setSize(400, 400); // default size in the absence of previous setting
        fm.loadPosition();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                fm.storePosition();
            }
        });
        frame.setVisible(true);
    }
}

}

1
user2709454

Der obere Rand des Rahmens hat die Größe 30. Sie können mit MouseInputAdapter Code zum Drucken der Koordinate eines beliebigen Punkts im Rahmen schreiben. Wenn sich der Cursor knapp unter dem oberen Rand des Rahmens befindet, ist die y-Koordinate nicht Null in der Nähe von 30. Wenn Sie dem Rahmen 300 * 300 eine Größe zuweisen, beträgt die Größe für das Anbringen der Komponenten auf dem Rahmen nur 300 * 270. Wenn Sie also die Größe 300 * 300 benötigen, geben Sie dem Rahmen eine Größe von 300 * 330 .

0
user8295702

Ich weiß, dass diese Frage über 6 Jahre alt ist, aber die Antwort von @Kyle funktioniert nicht.

Verwenden Sie dies

setSize(width - (getInsets().left + getInsets().right), height - (getInsets().top + getInsets().bottom));

Das funktioniert aber immer in jeder Größe:

setSize(width + 14, height + 7);

Wenn Sie nicht möchten, dass der Rand einen Rand darstellt, und nur den weißen Bereich, dann hier:

setSize(width + 16, height + 39);

Dies funktioniert auch nur unter Windows 10, für MacOS-Benutzer verwenden Sie die Antwort von @ ben.

0
user7485924