Search code examples
javaswingjpanelboxlayoutpreferredsize

How to resize JPanel when JFrame is maximized?


I am new to java swing, recently I try to create a swing app to format text. When I click the maximum button, the text panel's length does not resize, and the middle panel takes large space.

And seems setResizable(false) does not work

Code

public class MainFrame extends JFrame {

    private static final long serialVersionUID = 7553142908344084288L;

    private JTextArea fromTextArea;
    private JTextArea toTextArea;

    public MainFrame() {
        super("jFormatter");
        Panel mainPanel = new Panel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS));
        setContentPane(mainPanel);

        fromTextArea = createTextArea();

        lines.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 1, Color.LIGHT_GRAY));
        lines.setEditable(false);
        Font f = new Font(Font.SANS_SERIF, Font.PLAIN, 16);
        lines.setFont(f);

        JScrollPane fromTextAreaScrollPanel = new JScrollPane(fromTextArea);
        fromTextAreaScrollPanel.setBorder(BorderFactory.createEmptyBorder(15, 5, 15, 5));
        fromTextAreaScrollPanel.getViewport().add(fromTextArea);
        fromTextAreaScrollPanel.setRowHeaderView(lines);
        mainPanel.add(fromTextAreaScrollPanel);
        // control panel
        mainPanel.add(createCtrlPanel());

        toTextArea = createTextArea();
        mainPanel.add(createTextAreaPanel(toTextArea));

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setResizable(false);
        setVisible(true);
        setLocationRelativeTo(null);
    }

    private JPanel createCtrlPanel() {
        final JComboBox jComboBox = new JComboBox(formatters.keySet().toArray());
        jComboBox.setBorder(BorderFactory.createTitledBorder("Text Format"));

        JButton fmtButton = new JButton("Format >>");
        JPanel ctrPanel = new JPanel(new GridBagLayout());
        ctrPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        ctrPanel.add(jComboBox, gbc);
        ctrPanel.add(Box.createRigidArea(new Dimension(50, 15)), gbc);
        //gbc.fill = GridBagConstraints.NONE;
        ctrPanel.add(fmtButton, gbc);
        return ctrPanel;
    }

    private JScrollPane createTextAreaPanel(JTextArea textArea) {
        JScrollPane fromTextAreaScrollPanel = new JScrollPane(textArea);
        //fromTextAreaScrollPanel.setPreferredSize(new Dimension(300, 300));
        fromTextAreaScrollPanel.setBorder(BorderFactory.createEmptyBorder(15, 5, 15, 5));
        return fromTextAreaScrollPanel;
    }

    private JTextArea createTextArea() {
        JTextArea textArea = new JTextArea(20, 40);
        Font f = new Font(Font.SANS_SERIF, Font.PLAIN, 16);
        textArea.setFont(f);
        //fromTextArea.setLineWrap(true);
        //textArea.setBackground(Color.LIGHT_GRAY);
        textArea.setMargin(new Insets(0, 10, 0, 10));
        return textArea;
    }

    public static void main(String[] args) {
        new MainFrame();
    }
}

result: when maxium


Solution

  • Try to make a layout like this: enter image description here

    Code:

    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.border.EmptyBorder;
    
    public class Test extends JFrame {
    
        private JPanel contentPane;
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Test frame = new Test();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         * Create the frame.
         */
        public Test() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            GridBagLayout gbl_contentPane = new GridBagLayout();
    
            gbl_contentPane.columnWidths = new int[]{0, 0, 0, 0};
            gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
            gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE};
            gbl_contentPane.rowWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
            contentPane.setLayout(gbl_contentPane);
    
            JScrollPane scrollPane = new JScrollPane();
            GridBagConstraints gbc_scrollPane = new GridBagConstraints();
            gbc_scrollPane.gridheight = 2;
            gbc_scrollPane.insets = new Insets(0, 0, 0, 5);
            gbc_scrollPane.fill = GridBagConstraints.BOTH;
            gbc_scrollPane.gridx = 0;
            gbc_scrollPane.gridy = 0;
            gbc_scrollPane.weightx=1;
            contentPane.add(scrollPane, gbc_scrollPane);
    
            JTextArea textArea = new JTextArea();
            scrollPane.setViewportView(textArea);
    
            JPanel panel = new JPanel();
            GridBagConstraints gbc_panel = new GridBagConstraints();
            gbc_panel.gridheight = 2;
            gbc_panel.insets = new Insets(0, 0, 5, 5);
            //gbc_panel.fill = GridBagConstraints.BOTH;
            gbc_panel.gridx = 1;
            gbc_panel.gridy = 0;
            contentPane.add(panel, gbc_panel);
            GridBagLayout gbl_panel = new GridBagLayout();
            gbl_panel.columnWidths = new int[]{0, 0, 0, 0};
            gbl_panel.rowHeights = new int[]{0, 0, 0, 0, 0, 0};
            gbl_panel.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE};
            gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
            panel.setLayout(gbl_panel);
    
            JComboBox comboBox = new JComboBox();
            GridBagConstraints gbc_comboBox = new GridBagConstraints();
            gbc_comboBox.insets = new Insets(0, 0, 5, 0);
            gbc_comboBox.fill = GridBagConstraints.HORIZONTAL;
            gbc_comboBox.gridx = 2;
            gbc_comboBox.gridy = 0;
            gbc_comboBox.weightx=0.0;
            panel.add(comboBox, gbc_comboBox);
    
            JButton btnNewButton = new JButton(">>");
            GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
            gbc_btnNewButton.insets = new Insets(0, 0, 5, 0);
            gbc_btnNewButton.gridx = 2;
            gbc_btnNewButton.gridy = 1;
            panel.add(btnNewButton, gbc_btnNewButton);
    
            JScrollPane scrollPane_1 = new JScrollPane();
            GridBagConstraints gbc_scrollPane_1 = new GridBagConstraints();
            gbc_scrollPane_1.gridheight = 2;
            gbc_scrollPane_1.fill = GridBagConstraints.BOTH;
            gbc_scrollPane_1.gridx = 2;
            gbc_scrollPane_1.gridy = 0;
            gbc_scrollPane_1.weightx=1;
            contentPane.add(scrollPane_1, gbc_scrollPane_1);
    
            JTextArea textArea_1 = new JTextArea();
            scrollPane_1.setViewportView(textArea_1);
    pack();
            }
    
        }