Reputation: 81
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
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...
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