Search code examples
javaswingjmenubarjtoolbarjseparator

Java JMenuBar : Vertical JSeparator


I'm trying to add a vertical JSeparator in my menu. But it puts margins between my MenuItems. I want my items to stay left instead of left - center - right.

How it looks: enter image description here What I want: enter image description here

   JMenu settings = new JMenu("Settings");
    image = ImageIO.read(new File(Constants.IMAGES_DIR + File.separator + "settings.png"));
    settings.setHorizontalTextPosition(SwingConstants.CENTER);
    settings.setVerticalTextPosition(SwingConstants.BOTTOM);
    settings.setIcon(new ImageIcon(image));
    add(settings);

    JMenu build = new JMenu("Builder");
    image = ImageIO.read(new File(Constants.IMAGES_DIR + File.separator + "build.png"));
    build.setHorizontalTextPosition(SwingConstants.CENTER);
    build.setVerticalTextPosition(SwingConstants.BOTTOM);
    build.setIcon(new ImageIcon(image));
    add(build);

    add(new JSeparator(JSeparator.VERTICAL));

    JMenu help = new JMenu("Help");
    image = ImageIO.read(new File(Constants.IMAGES_DIR + File.separator + "help.png"));
    help.setHorizontalTextPosition(SwingConstants.CENTER);
    help.setVerticalTextPosition(SwingConstants.BOTTOM);
    help.setIcon(new ImageIcon(image));
    add(help);

hope you understand what I want.


Solution

  • I suggest doing this by using JToolBar instead of JMenuBar. But in case you must/should/like to do it using JMenuBar here goes an example:

    public class Test {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new JFrame();
    
                    JMenuBar bar = new JMenuBar();
                    bar.setLayout(new MigLayout());
    
                    JMenu listSth = new JMenu("A");
                    listSth.setHorizontalTextPosition(SwingConstants.CENTER);
                    listSth.setVerticalTextPosition(SwingConstants.BOTTOM);
                    bar.add(listSth);
    
                    JSeparator sep1 = new JSeparator(JSeparator.VERTICAL);
                    bar.add(sep1, "growy");
                    JMenu module = new JMenu("B");
                    module.setHorizontalTextPosition(SwingConstants.CENTER);
                    module.setVerticalTextPosition(SwingConstants.BOTTOM);
                    bar.add(module);
    
                    JMenu settings = new JMenu("Settings");
                    settings.setHorizontalTextPosition(SwingConstants.CENTER);
                    settings.setVerticalTextPosition(SwingConstants.BOTTOM);
                    bar.add(settings);
    
                    JMenu build = new JMenu("Builder");
                    build.setHorizontalTextPosition(SwingConstants.CENTER);
                    build.setVerticalTextPosition(SwingConstants.BOTTOM);
                    bar.add(build);
    
                    JSeparator sep2 = new JSeparator(JSeparator.VERTICAL);
                    bar.add(sep2, "growy");
    
                    JMenu help = new JMenu("Help");
                    help.setHorizontalTextPosition(SwingConstants.CENTER);
                    help.setVerticalTextPosition(SwingConstants.BOTTOM);
                    bar.add(help);
    
                    frame.setJMenuBar(bar);
                    frame.pack();
                    frame.setSize(400, 300);
                    frame.setLocationRelativeTo(null);
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    In simple words - you can use MigLayout and set "growy" on your JSeparators. There are many other solutions for this (using different layout).