kagushajeiel
kagushajeiel

Reputation: 81

Java (swing) toolbar not showing

I have been following this tutorial:
Java toolbar tutorial
However when I tried to insert a toolbar into the GUI, it doesn't show up. Can someone kindly give me advice on what to do? The code so far is this:

import javax.swing.Box;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.AbstractAction;
import static javax.swing.Action.MNEMONIC_KEY;
import static javax.swing.Action.SMALL_ICON;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.KeyStroke;
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.BorderFactory;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JLabel;
import javax.swing.JToolBar;

public class gui extends JFrame {

private JLabel statusbar;

public gui() {

    initUI();
}

private void initUI() { 

    createMenuBar();
    createToolBar();

    statusbar = new JLabel("Ready");
    statusbar.setBorder

 (BorderFactory.createEtchedBorder());
  add(statusbar, BorderLayout.SOUTH);

    JButton quitButton = new JButton("Quit");
    quitButton.setToolTipText("A button component");

    quitButton.addActionListener(new ActionListener() 

{
        @Override
        public void actionPerformed(ActionEvent event) 

{
            System.exit(0);
        }
    });

    quitButton.setMnemonic(KeyEvent.VK_B);

    createLayout(quitButton);

    setTitle("Typing Tutor");
    setSize(360, 250);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

private void createMenuBar() {

    JMenuBar menubar = new JMenuBar();

    ImageIcon iconNew = new ImageIcon("new.png");
    ImageIcon iconOpen = new ImageIcon("open.png");
    ImageIcon iconSave = new ImageIcon("save.png");
    ImageIcon iconExit = new ImageIcon("exit.png");

    JMenu fileMenu = new JMenu("File");
    fileMenu.setMnemonic(KeyEvent.VK_F);

    // Old code 

    JMenu impMenu = new JMenu("Import");
    fileMenu.setMnemonic(KeyEvent.VK_I);

    JMenuItem newsfMi = new JMenuItem("Import newsfeed list...");
    JMenuItem bookmMi = new JMenuItem("Import bookmarks...");
    JMenuItem mailMi = new JMenuItem("Import mail...");

    impMenu.add(newsfMi);
    impMenu.add(bookmMi);
    impMenu.add(mailMi);

    JMenuItem newMi = new JMenuItem("New", iconNew);
    JMenuItem openMi = new JMenuItem("Open", iconOpen);
    JMenuItem saveMi = new JMenuItem("Save", iconSave);

    JMenuItem exitMi = new JMenuItem("Exit", iconExit);
    exitMi.setMnemonic(KeyEvent.VK_E);
    exitMi.setToolTipText("Exit application");
    exitMi.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) 

    {
                System.exit(0);
            }
        });

        // New code

        JMenu viewMenu = new JMenu("View");
        viewMenu.setMnemonic(KeyEvent.VK_V);

        JCheckBoxMenuItem sbarMi = new JCheckBoxMenuItem

("Show status bar");
        sbarMi.setMnemonic(KeyEvent.VK_S);
        sbarMi.setDisplayedMnemonicIndex(5);
        sbarMi.setSelected(true);

        sbarMi.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {

                if (e.getStateChange() == 

ItemEvent.SELECTED) {
                    statusbar.setVisible(true);
                } else {
                    statusbar.setVisible(false);
                }

            }

        });

        // Newer code
        JMenu helpMenu = new JMenu("Help");


        viewMenu.add(sbarMi);
        fileMenu.add(newMi);
        fileMenu.add(openMi);
        fileMenu.add(saveMi);
        fileMenu.addSeparator();
        fileMenu.add(impMenu);
        fileMenu.addSeparator();
        fileMenu.add(exitMi);


        menubar.add(fileMenu);
        menubar.add(viewMenu);
        menubar.add(Box.createHorizontalGlue());
        menubar.add(helpMenu);

        setJMenuBar(menubar);
    }

 private void createToolBar() {

        JToolBar toolbar = new JToolBar();

        ImageIcon icon = new ImageIcon("exit.png");

        JButton exitButton = new JButton(icon);
        toolbar.add(exitButton);

        exitButton.addActionListener(new ActionListener() 

{
            @Override
            public void actionPerformed(ActionEvent event) 

{
                System.exit(0);
            }
        });

        add(toolbar, BorderLayout.NORTH);        
    }

    private void createLayout(JComponent... arg) {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        gl.setHorizontalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
        );

        pack();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                gui ex = new gui();
                ex.setVisible(true);
            }
        });
    }
}

I also checked stackoverflow and google searches but I the ones I've seen were either for android and/or I can understand. Some advice would be greatly appreciated. Thank you.

Upvotes: 0

Views: 1170

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347194

You've changed the layout AFTER creating and adding the JToolBar (to GroupLayout - don't get me started on that choice)

So, if we change createLayout so it creates a secondary component, something like...

private void createLayout(JComponent... arg) {

    JPanel pane = new JPanel();
    //Container pane = getContentPane();
    GroupLayout gl = new GroupLayout(pane);
    pane.setLayout(gl);

    gl.setAutoCreateContainerGaps(true);

    gl.setHorizontalGroup(gl.createSequentialGroup()
                    .addComponent(arg[0])
    );

    gl.setVerticalGroup(gl.createSequentialGroup()
                    .addComponent(arg[0])
    );

    add(pane);

    pack();
}

It will now display something like...

Frame

Because both your content AND the JToolBar need to live in contentPane, you need to be concious of any changes you make to it. This solution makes a secondary pane, onto which you "main" content can be placed, in what ever manner you want, but which is then added to the contentPane which is still using a BorderLayout

Upvotes: 1

Related Questions