Ich bemerkte ein seltsames Verhalten zwischen den Containern in der Schaukel.Warum überschreitet die Größe des JFrame die Größe seines ContentPane, obwohl er eine definierte Größe hat?
Um den Test zu veranschaulichen, habe ich ein JFrame und ein JPanel erstellt und das Panel als contentPane festgelegt. Ich habe die bevorzugte und maximale JPanel-Größe auf 400.300 festgelegt. All dies kann im Beispiel unten zu sehen:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ExcessiveSpacePanelTest {
JFrame frame;
JPanel panel;
public void initGUI(){
frame = new JFrame();
panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
panel.setPreferredSize(new Dimension(400, 300));
panel.setMaximumSize(new Dimension(400, 300));
frame.setContentPane(panel);
frame.pack();
System.out.println("panel size: [" + panel.getSize().width + "," + panel.getSize().height +"]");
System.out.println("frame size: [" + frame.getSize().width + "," + frame.getSize().height+"]");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(() ->{
new ExcessiveSpacePanelTest().initGUI();
});
}
}
Das Ergebnis ist:
Zu meiner Überraschung, der Ausgang am Terminal ist:
Panel-Größe: [400,300]
Rahmengröße: [416,338]
Ich habe nicht verstanden, warum der Rahmen diesen zusätzlichen Platz hinzugefügt hat, sogar nichts in der Komponente, die den Rahmen zur Größenänderung zwingt.
Ich habe versucht, zeroed Kanten auf dem Panel durch Hinzufügen der Zeile panel.setBorder (BorderFactory.createEmptyBorder(0, 0, 0, 0));
vor pack();
, aber das Ergebnis ist immer noch das gleiche.
Das Problem mit diesem ist, dass Java mir eine falsche Info gibt, da das Panel in der Größe des Rahmens skaliert, und vom obigen Ergebnis haben wir gesehen, dass die zwei nicht die gleiche Größe haben.
Werden die beiden Maßnahmen korrekt gemeldet? Warum passiert das?
Vielleicht kann dies hilfreich sein: http://stackoverflow.com/a/11939203/6776262 – quackenator
Dank @quackenator.Aber ich möchte auch verstehen, warum dieser zusätzliche Platz nur ein leeres Panel mit festen Abmessungen enthält. – Articuno
Der JFrame enthält den äußeren Rahmen und die Titelleiste. Sie könnten 'frame.getContentPane(). GetSize();' versuchen, um die Größe des Inhaltspanels zu erhalten. – quackenator