I noticed a strange behavior between containers in the swing.
To exemplify the test, I created a JFrame and a JPanel, and set the panel as contentPane. I defined th
You may find it helpful to compare the result from a similar program on a different platform. In particular,
The red Border
is inside the panel; your usage conforms to the API recommendation, "we recommend that you put the component in a JPanel
and set the border on the JPanel
."
The frame width matches the panel width on Mac OS X because the heavyweight peer used for the top-level container has no vertical border on Mac OS X; the Windows peer has its own border.
The frame height includes the drag bar and frame border: 38 pixels on Widows, 22 on Mac OS X.
Don't use setPreferredSize()
when you really mean to override getPreferredSize().
As an aside, the frame's add()
method forwards to the content pane.
panel size: [400,300]
frame size: [400,322]
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() {
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
};
panel.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
frame.add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
System.out.println("panel size: [" + panel.getSize().width + "," + panel.getSize().height +"]");
System.out.println("frame size: [" + frame.getSize().width + "," + frame.getSize().height+"]");
}
public static void main(String[] args) {
EventQueue.invokeLater(() ->{
new ExcessiveSpacePanelTest().initGUI();
});
}
}