1

Please have a look at the following code

import java.awt.GridLayout;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestSend extends JFrame 
    {
        private Box names, emails;
        private JButton ok;
        private Map mMap;
        private JLabel nameLabel, emailLabel;
        private JPanel mainPanel;
        private JScrollPane scroll;


        public TestSend()
        {
            names = new Box(BoxLayout.Y_AXIS);
            emails = new Box(BoxLayout.Y_AXIS);

            nameLabel = new JLabel("Names");
            emailLabel = new JLabel("Email");

            mainPanel = new JPanel();
            mainPanel.setLayout(new GridLayout(2,2));

            scroll = new JScrollPane(mainPanel);

            mainPanel.add(nameLabel);
            mainPanel.add(emailLabel);
            mainPanel.add(names);
            mainPanel.add(emails);

            mMap = new HashMap();

            mMap.put("yohan", "yy@yahoo.com");
            mMap.put("Gihan", "gihan@yahoo.com");
            mMap.put("Sumi", "sumi@yahoo.com");
            mMap.put("mac", "mac@yahoo.com");
            mMap.put("Jay", "jay@yahoo.com");
            mMap.put("Rom", "rom@yahoo.com");
            mMap.put("shane", "shane@yahoo.com");
            mMap.put("Mafe", "mafe@yahoo.com");
            mMap.put("willi", "willi@yahoo.com");

            Iterator iter = mMap.entrySet().iterator();



            while(iter.hasNext())
            {
                Map.Entry mEntry = (Map.Entry)iter.next();

                JCheckBox cBox = new JCheckBox((String)mEntry.getKey());

                names.add(cBox);

                if((String)mEntry.getValue() != null && ((String)mEntry.getValue()).length() != 0  && !((String)mEntry.getValue()).equals(""))
                {
                    JLabel lLabel = new JLabel((String)mEntry.getValue());
                   // lLabel.setPreferredSize(new Dimension(cBox.getPreferredSize().width,cBox.getPreferredSize().height));
                    emails.add(lLabel);
                    emails.add(new JPanel());

                }
                else
                {
                    JLabel lLabel = new JLabel();
                    //lLabel.setPreferredSize(new Dimension(cBox.getPreferredSize().width,cBox.getPreferredSize().height));
                    emails.add(lLabel);
                    emails.add(new JPanel());
                }

            }


            this.add(scroll);
            this.pack();
            this.setVisible(true);

        }

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

When you execute it, you can see that JLabel contains less vertical gap as compared to JCheckBox. As a result, "Email Addresses" (JLabel) are not displayed in the same line where "Names" (JCheckBox) are displayed. How can I fix this?

PeakGen
  • 21,894
  • 86
  • 261
  • 463

2 Answers2

2

GridLayout has a nice feature that lets you use 0 to signify any number of rows or columns (but not both at once). Also,

  • Specify your Map parameters: Map<String, String>.

  • Set implements Iterable, which permits a for-each loop with Map.Entry.

  • Swing GUI objects should be constructed and manipulated only on the event dispatch thread.

image

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestSend extends JFrame {

    private JPanel names = new JPanel(new GridLayout(0, 1));
    private Map<String, String> mMap = new HashMap<String, String>();

    public TestSend() {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel top = new JPanel(new GridLayout(1, 0));
        top.add(new JLabel("Names"));
        top.add(new JLabel("Email"));
        names.add(top);

        mMap.put("yohan", "yy@yahoo.com");
        mMap.put("Gihan", "gihan@yahoo.com");
        mMap.put("Sumi", "sumi@yahoo.com");
        mMap.put("mac", "mac@yahoo.com");
        mMap.put("Jay", "jay@yahoo.com");
        mMap.put("Rom", "rom@yahoo.com");
        mMap.put("shane", "shane@yahoo.com");
        mMap.put("Mafe", "mafe@yahoo.com");
        mMap.put("willi", "willi@yahoo.com");
        for (Map.Entry<String, String> e : mMap.entrySet()) {
            names.add(createPanel(e.getKey(), e.getValue()));
        }

        this.add(new JScrollPane(names));
        this.pack();
        this.setVisible(true);
    }

    private static JPanel createPanel(String s1, String s2) {
        JPanel panel = new JPanel(new GridLayout(1, 0));
        panel.add(new JCheckBox(s1));
        panel.add(new JLabel(s2));
        return panel;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestSend();
            }
        });
    }
}
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
1

You have a GridLayout with four large cells, and you're adding checkboxes and emails to different cells separately. They don't know of each other and are aligned based only on their size, which is different.

To align each checkbox to each email, add them to the layout with regard to their relationship. The simplest way is to make a GridLayout not 2x2 but (N+1)x2, and then add each checkbox and each email to a separate cell. You can also use GridBagLayout, it doesn't require to know the number of cells in advance.

Goblin Alchemist
  • 829
  • 5
  • 11