javaswing

JFrame resized below its content pane's minimum


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

JFrame resized below its content pane's minimum


Solution

  • 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());