Why can I shrink a JFrame
beyond its content pane's minimum width, and how do I make Swing enforce the constraint?
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
public class PanelExample {
JPanel panel;
JLabel panelWidthLabel;
public static void main(String[] args) {
SwingUtilities.invokeLater(new PanelExample()::launch);
}
private void launch() {
JFrame frame = new JFrame("Panel Example");
frame.setContentPane(createPanel());
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private JPanel createPanel() {
panel = new JPanel();
panelWidthLabel = new JLabel();
panel.add(panelWidthLabel);
panel.addComponentListener(onComponentResized(this::displayPanelDimension));
panel.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
panel.setPreferredSize(new Dimension(250, 150));
panel.setMinimumSize(new Dimension(200, 150)); // not honored
return panel;
}
private static ComponentListener onComponentResized(Runnable onComponentResized) {
return new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
onComponentResized.run();
}
};
}
private void displayPanelDimension() {
Dimension panelSize = panel.getSize();
panelWidthLabel.setText(createDimensionText(panelSize));
}
private static String createDimensionText(Dimension dimension) {
String dimensionText = String.format("%d:%d", (int) dimension.getWidth(), (int) dimension.getHeight());
return dimensionText;
}
}
how do I make Swing enforce the constraint?
Don't know if it will help but, you can set the minimum size of the frame:
frame.setVisible(true);
frame.setMinimumSize(frame.getMinimumSize());