Search code examples
javaswingjbuttonlayout-managerjspinner

JSpinners and JButton in GridBagLayout Swing


This is my code creating my message panel :

private class MessagePane extends JPanel {
    private MessagePane() {
        setLayout(new GridBagLayout());
        setBackground(backgroundColor);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(4, 4, 4, 4);

        add(allowButton, gbc);
        gbc.gridx = 1;
        add(blockButton, gbc);

        gbc.gridwidth = 2;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.weightx = 1;
        gbc.weighty = 1;
        add(timerL, gbc);
        gbc.fill = GridBagConstraints.BOTH;
        add(new JScrollPane(messageArea), gbc);

        gbc = new GridBagConstraints();
        gbc.gridy = 2;
        gbc.gridx = 0;
        add(countryList, gbc);

        gbc.gridx = 1;
        add(msgList, gbc);

        gbc.gridx = 2;
        add(sendButton, gbc);

        setVisible(true);
    }
}

And view of this looks like :

bad look panel

The view that I want to achieve :

good look panel

Can you help me with this?


Solution

  • I created the following GUI using GridBagLayout.

    MessagePanel GUI

    I had to put the top two buttons in their own JPanel so that they would be the same size. I used a GridBagLayout for both the button panel and the main panel.

    I created a GridBagConstraints for each and every Swing component. That way, I can set the insets how I wish and can specify a different anchor and fill for each component.

    I had to guess which Swing components the OP used since they weren't defined in the code he posted.

    Here's the complete, runnable example that generated the GUI.

    import java.awt.Component;
    import java.awt.Container;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSpinner;
    import javax.swing.JTextArea;
    import javax.swing.SpinnerListModel;
    import javax.swing.SwingUtilities;
    
    public class MessageApplication implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new MessageApplication());
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Message Panel");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            frame.add(new MessagePanel().getPanel());
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public class MessagePanel {
    
            private JPanel panel;
    
            public MessagePanel() {
                // top, left, bottom, right
                Insets topLeftInsets = new Insets(10, 10, 10, 10);
                Insets topInsets = new Insets(10, 0, 10, 10);
                Insets leftInsets = new Insets(0, 10, 10, 10);
                Insets insets = new Insets(0, 0, 10, 10);
                Insets messageInsets = new Insets(2, 4, 2, 4);
                Insets zeroInsets = new Insets(0, 0, 0, 0);
    
                panel = new JPanel();
                panel.setLayout(new GridBagLayout());
    
                int gridy = 0;
    
                JPanel buttonPanel = new JPanel();
                buttonPanel.setLayout(new GridBagLayout());
    
                JButton allowButton = new JButton("ALLOW");
                addComponent(buttonPanel, allowButton, 0, gridy, 1, 1, 
                        topLeftInsets, GridBagConstraints.CENTER,
                        GridBagConstraints.HORIZONTAL);
    
                JButton blockButton = new JButton("BLOCK");
                addComponent(buttonPanel, blockButton, 1, gridy, 1, 1, 
                        topInsets, GridBagConstraints.CENTER,
                        GridBagConstraints.HORIZONTAL);
    
                addComponent(panel, buttonPanel, 0, gridy++, 6, 1, 
                        zeroInsets, GridBagConstraints.CENTER,
                        GridBagConstraints.HORIZONTAL);
    
                JTextArea messageArea = new JTextArea(12, 30);
                messageArea.setEditable(false);
                messageArea.setMargin(messageInsets);
                messageArea.setText("I'm a message area.");
                JScrollPane scrollPane = 
                        new JScrollPane(messageArea);
                addComponent(panel, scrollPane, 0, gridy++, 6, 1, 
                        leftInsets, GridBagConstraints.CENTER,
                        GridBagConstraints.HORIZONTAL);
    
                String[] countryStrings = { "US", "CA" };
                SpinnerListModel countryModel = 
                        new SpinnerListModel(countryStrings);
                JSpinner countryList = new JSpinner(countryModel);
                addComponent(panel, countryList, 0, gridy, 1, 1, 
                        leftInsets, GridBagConstraints.CENTER,
                        GridBagConstraints.HORIZONTAL);
    
                String[] msgStrings = { "Message to the client", 
                        "Message to the shipper" };
                SpinnerListModel msgModel = 
                        new SpinnerListModel(msgStrings);
                JSpinner msgList = new JSpinner(msgModel);
                addComponent(panel, msgList, 1, gridy, 4, 1, 
                        insets, GridBagConstraints.CENTER,
                        GridBagConstraints.HORIZONTAL);
    
                JButton sendButton = new JButton("SEND");
                addComponent(panel, sendButton, 5, gridy++, 1, 1, 
                        insets, GridBagConstraints.CENTER,
                        GridBagConstraints.HORIZONTAL);
            }
    
            private void addComponent(Container container, 
                    Component component, int gridx, int gridy, 
                    int gridwidth, int gridheight, Insets insets, 
                    int anchor, int fill) {
                GridBagConstraints gbc = new GridBagConstraints(
                        gridx, gridy, gridwidth, gridheight, 
                        1.0, 1.0, anchor, fill, insets, 0, 0);
                container.add(component, gbc);
            }
    
    
            public JPanel getPanel() {
                return panel;
            }
    
        }
    
    }