Just a simple GUI
Shows a JMenu >> JMenuItem
One of those menu items shows a JPopupMenu
My issue is that the JMenuItems' are setVisible(false) on press, by default
I've tried it with MouseAdapter too.
public class SubMenu extends JFrame
{
JMenuBar menubar = new JMenuBar();
JMenu File = new JMenu("File");
JMenuItem New = new JMenuItem("New");
JMenuItem Open = new JMenuItem("Open");
JMenuItem Save = new JMenuItem("Save");
JMenuItem Import = new JMenuItem("Import");
JPopupMenu Import_Popup = new JPopupMenu();
JMenuItem Import_Pop_1 = new JMenuItem("Import newsfeed list...");
JMenuItem Import_Pop_2 = new JMenuItem("Import bookmarks...");
JMenuItem Import_Pop_3 = new JMenuItem("Import mail...");
JMenuItem Exit = new JMenuItem("Exit");
SubMenu()
{
setTitle("SubMenu");
setSize(500, 500);
setLocation(200, 200);
setVisible(true);
setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
menubar.setBounds(0, 0, 2000, 30);
add(menubar);
menubar.add(File);
File.add(New);
File.add(Open);
File.add(Save);
File.add(new JSeparator());
File.add(Import);
File.add(new JSeparator());
File.add(Exit);
add(Import_Popup);
Import_Popup.add(Import_Pop_1);
Import_Popup.add(Import_Pop_2);
Import_Popup.add(Import_Pop_3);
// The issue is Right here.
Import.addActionListener(new ActionListener()
{
#Override
public void actionPerformed(ActionEvent e)
{
Import_Popup.show(Import, Import.getWidth(), 0);
}
});
}// Constructor
public static void main(String[] args)
{
new SubMenu();
}
}
Raises this exception on Press :
component must be showing on the screen to determine its location
Is there a way to keep JMenuItems visible after press?
Related
anyone can tell why the class OpenMenuListener doesnt send a feedback when i click the open button in my Gui ? The erase button works though. It sends me a feedback. I'm exausted.
import java.awt.*;
import javax.swing.*;
public class DrawingApplication extends JFrame {
JComponent drawingArea;
class EraseButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("Clicked erase");
}
}
class OpenMenuListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
System.out.println("Clicked open");
}
}
public DrawingApplication() {
JPanel frame = new JPanel();
add(frame);
// panel1.add( new JButton(Figuur),BorderLayout.CENTER);
drawingArea = new JLabel();
// label1.add(drawingArea);
frame.add(drawingArea);
// Creates a menubar for a JFrame
JMenuBar menuBar = new JMenuBar();
// Add the menubar to the frame
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("File");
menuBar.add(fileMenu);
JMenu open = new JMenu("Open");
fileMenu.add(open);
fileMenu.addSeparator();
JMenu save = new JMenu("Save");
fileMenu.add(save);
fileMenu.addSeparator();
JMenu close =new JMenu("Close");
fileMenu.add(close);
JMenu helpMenu = new JMenu("Help");
menuBar.add(helpMenu);
helpMenu.add(new JMenu("Info"));
JPanel panel2 = new JPanel();
add(BorderLayout.SOUTH, frame);
frame.add(new JLabel("figuurkeuze"));
frame.add(panel2);
setVisible(true);
JRadioButton rectButton = new JRadioButton("Rectangle");
JRadioButton triangleButton = new JRadioButton("Triangle");
JRadioButton circleButton = new JRadioButton("Circle");
frame.add(rectButton);
frame.add(triangleButton);
frame.add(circleButton);
JButton erase = new JButton("Erase");
frame.add(erase);
EraseButtonListener eraselistener = new EraseButtonListener();
erase.addActionListener(eraselistener);
OpenMenuListener openMenuListener = new OpenMenuListener();
open.addActionListener(openMenuListener);
}
public static void main(String[] args) {
DrawingApplication frame = new DrawingApplication();
frame.setTitle("My prgram");
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
It seems a problem of name aliasing, you add the listener to the open variable which is declared as a JMenuItem, so you are adding the ActionListener to the menu item instead that to a button (that you never declare since there is no JButton open = new JButton("open") anywhere).
I have the following SwingMenu class.
package base;
import javax.swing.*;
public class SwingMenu {
public static void main(String[] args) {
SwingMenu s = new SwingMenu();
}
public SwingMenu() {
JFrame frame = new JFrame(
"Creating a JMenuBar, JMenu, JMenuItem and seprator Component");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menubar = new JMenuBar();
JMenu filemenu = new JMenu("File");
filemenu.add(new JSeparator());
JMenu editmenu = new JMenu("Edit");
editmenu.add(new JSeparator());
JMenuItem fileItem1 = new JMenuItem("New");
JMenuItem fileItem2 = new JMenuItem("Open");
JMenuItem fileItem3 = new JMenuItem("Close");
fileItem3.add(new JSeparator());
JMenuItem fileItem4 = new JMenuItem("Save");
JMenuItem editItem1 = new JMenuItem("Cut");
JMenuItem editItem2 = new JMenuItem("Copy");
editItem2.add(new JSeparator());
JMenuItem editItem3 = new JMenuItem("Paste");
JMenuItem editItem4 = new JMenuItem("Insert");
filemenu.add(fileItem1);
filemenu.add(fileItem2);
filemenu.add(fileItem3);
filemenu.add(fileItem4);
editmenu.add(editItem1);
editmenu.add(editItem2);
editmenu.add(editItem3);
editmenu.add(editItem4);
menubar.add(filemenu);
menubar.add(editmenu);
frame.setJMenuBar(menubar);
frame.setSize(400, 400);
frame.setVisible(true);
}
}
And I want to display the Menu by calling it from the this main class.
package base;
import javax.swing.*;
import java.awt.*;
import base.SwingMenu;
public class StickyNotes {
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("Java Sticky Notes");
frame.setPreferredSize(new Dimension(5000, 5000));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout(FlowLayout.LEFT));
// Add Label
JLabel label = new JLabel("Type Below");
frame.getContentPane().add(label);
// Add Main Menu
SwingMenu mainBar = new SwingMenu();
//frame.setJMenuBar(mainBar);
//frame.getContentPane().add(mainBar);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public Container createContentPane() {
// Create the content-pane-to-be.
JPanel jplContentPane = new JPanel(new BorderLayout());
jplContentPane.setLayout(new BorderLayout());
jplContentPane.setOpaque(true);
return jplContentPane;
}
public static void main(String[] args) {
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
I just cannot figure it out all morning :) How do I get the Menu Bar to show up in Java Swing?
// Add Main Menu
SwingMenu mainBar = new SwingMenu();
Check this modified code example :
import javax.swing.*;
import java.awt.*;
public class StickyNotes {
private JMenuBar getMenuBar()
{
JMenuBar menubar = new JMenuBar();
JMenu filemenu = new JMenu("File");
filemenu.add(new JSeparator());
JMenu editmenu = new JMenu("Edit");
editmenu.add(new JSeparator());
JMenuItem fileItem1 = new JMenuItem("New");
JMenuItem fileItem2 = new JMenuItem("Open");
JMenuItem fileItem3 = new JMenuItem("Close");
fileItem3.add(new JSeparator());
JMenuItem fileItem4 = new JMenuItem("Save");
JMenuItem editItem1 = new JMenuItem("Cut");
JMenuItem editItem2 = new JMenuItem("Copy");
editItem2.add(new JSeparator());
JMenuItem editItem3 = new JMenuItem("Paste");
JMenuItem editItem4 = new JMenuItem("Insert");
filemenu.add(fileItem1);
filemenu.add(fileItem2);
filemenu.add(fileItem3);
filemenu.add(fileItem4);
editmenu.add(editItem1);
editmenu.add(editItem2);
editmenu.add(editItem3);
editmenu.add(editItem4);
menubar.add(filemenu);
menubar.add(editmenu);
return menubar;
}
private void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("Java Sticky Notes");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout(FlowLayout.LEFT));
// Add Label
JLabel label = new JLabel("Type Below");
frame.getContentPane().add(label);
// Add Main Menu
frame.setJMenuBar(getMenuBar());
// Display the window.
frame.pack();
frame.setVisible(true);
}
public Container createContentPane() {
// Create the content-pane-to-be.
JPanel jplContentPane = new JPanel(new BorderLayout());
jplContentPane.setLayout(new BorderLayout());
jplContentPane.setOpaque(true);
return jplContentPane;
}
public static void main(String[] args) {
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new StickyNotes().createAndShowGUI();
}
});
}
}
Or you can modify your code a bit like this, if you really wanted to keep the JMenuBar set up in a different Class, where you can simply make an Object of the SwingMenu Class and call the method getMenuBar() by making an Object of this Class :
import javax.swing.*;
import java.awt.*;
public class StickyNotes {
private void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("Java Sticky Notes");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout(FlowLayout.LEFT));
// Add Label
JLabel label = new JLabel("Type Below");
frame.getContentPane().add(label);
// Add Main Menu
SwingMenu swingMenu = new SwingMenu();
frame.setJMenuBar(swingMenu.getMenuBar());
// Display the window.
frame.pack();
frame.setVisible(true);
}
public Container createContentPane() {
// Create the content-pane-to-be.
JPanel jplContentPane = new JPanel(new BorderLayout());
jplContentPane.setLayout(new BorderLayout());
jplContentPane.setOpaque(true);
return jplContentPane;
}
public static void main(String[] args) {
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new StickyNotes().createAndShowGUI();
}
});
}
}
class SwingMenu {
public JMenuBar getMenuBar()
{
JMenuBar menubar = new JMenuBar();
JMenu filemenu = new JMenu("File");
filemenu.add(new JSeparator());
JMenu editmenu = new JMenu("Edit");
editmenu.add(new JSeparator());
JMenuItem fileItem1 = new JMenuItem("New");
JMenuItem fileItem2 = new JMenuItem("Open");
JMenuItem fileItem3 = new JMenuItem("Close");
fileItem3.add(new JSeparator());
JMenuItem fileItem4 = new JMenuItem("Save");
JMenuItem editItem1 = new JMenuItem("Cut");
JMenuItem editItem2 = new JMenuItem("Copy");
editItem2.add(new JSeparator());
JMenuItem editItem3 = new JMenuItem("Paste");
JMenuItem editItem4 = new JMenuItem("Insert");
filemenu.add(fileItem1);
filemenu.add(fileItem2);
filemenu.add(fileItem3);
filemenu.add(fileItem4);
editmenu.add(editItem1);
editmenu.add(editItem2);
editmenu.add(editItem3);
editmenu.add(editItem4);
menubar.add(filemenu);
menubar.add(editmenu);
return menubar;
}
}
You are creating 2 different JFrames. After creating the JFrame:
JFrame frame = new JFrame("Java Sticky Notes");
Create the menu bar and assign it to the JFrame:
JMenuBar menubar = new JMenuBar();
// ...
frame.setJMenuBar(menubar);
No need for:
SwingMenu mainBar = new SwingMenu();
Try this out:
This basically makes SwingMenu a manu bar which will help encapsulating the build of the menu bar.
public class SwingMenu extends JMenuBar{
public SwingMenu() {
JMenu filemenu = new JMenu("File");
JMenu editmenu = new JMenu("Edit");
// Build your file menu and edit menu here...
add(filemenu);
add(editmenu);
}
}
Now, in your createAndShowGUI() just create a form and add the newly created menu bar to it.
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("Java Sticky Notes");
// other stuff...
// Add Main Menu
SwingMenu mainBar = new SwingMenu();
frame.setJMenuBar(mainBar);
// Display the window.
frame.pack();
frame.setVisible(true);
}
I had a simple drawing application. I need to add a menu and a toolbar on the left side.
So now, instead of using a simple JFrame, I'm creating a simple class that extends JFrame. I was able to add the menu following some examples online, but can't figure out how to add a JToolBar. I've tried a few different ways, but nothing works. I don't get an error, everything complies just fine, but I don't see any JToolBar.
Here's the code for my JFrame, I hope you can help.
class Menu extends JFrame {
private JMenuItem openItem;
private JMenuItem saveItem;
private JMenuItem saveAsItem;
public Menu(String title) {
openItem = new JMenuItem("Open...");
openItem.setMnemonic('O');
openItem.setAccelerator(KeyStroke.getKeyStroke("control O"));
saveItem = new JMenuItem("Save");
saveItem.setMnemonic('S');
saveItem.setAccelerator(KeyStroke.getKeyStroke("control S"));
saveAsItem = new JMenuItem("Save As...");
saveAsItem.setMnemonic('S');
saveAsItem.setAccelerator(KeyStroke.getKeyStroke("control S"));
// (2) Build menubar, menus, and add menuitems.
JMenuBar menubar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic('F');
menubar.add(fileMenu);
fileMenu.add(openItem);
fileMenu.addSeparator();
fileMenu.add(saveItem);
// (3) Add listeners to menu items
openItem.addActionListener(new OpenAction()); // TODO change
setJMenuBar(menubar);
JToolBar toolbar = new JToolBar("Toolbar", JToolBar.VERTICAL);//);
// JPanel panel = new JPanel();
// panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JButton newb = new JButton("new");
toolbar.add(newb);
// toolbar.setOpaque(true);
toolbar.setLocation(100, 100);
toolbar.setVisible(true);
// toolbar.setMinimumSize(new Dimension(100, 100));
// toolbar.setAlignmentX(0);
// panel.add(toolbar);
add(toolbar, BorderLayout.NORTH);
getContentPane().add(toolbar, BorderLayout.NORTH);
// getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
setTitle(title);
pack();
setLocationRelativeTo(null); // Center window.
}
// OpenAction
class OpenAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Menu.this, "Can't Open.");
}
}
}
its work fine, and you don't need to setVisible tool bar because its showing by default, also don't add the tool bar two time in the same place (NORTH)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MenuDemo {
public static void main(String... args) {
EventQueue.invokeLater(
new Runnable() {
#Override
public void run() {
JFrame menu = new Menu("Testing");
menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
menu.setVisible(true);
}
}
);
}
}
class Menu extends JFrame {
private JMenuItem openItem;
private JMenuItem saveItem;
private JMenuItem saveAsItem;
public Menu(String title) {
openItem = new JMenuItem("Open...");
openItem.setMnemonic('O');
openItem.setAccelerator(KeyStroke.getKeyStroke("control O"));
saveItem = new JMenuItem("Save");
saveItem.setMnemonic('S');
saveItem.setAccelerator(KeyStroke.getKeyStroke("control S"));
saveAsItem = new JMenuItem("Save As...");
saveAsItem.setMnemonic('S');
saveAsItem.setAccelerator(KeyStroke.getKeyStroke("control S"));
// (2) Build menubar, menus, and add menuitems.
JMenuBar menubar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic('F');
menubar.add(fileMenu);
fileMenu.add(openItem);
fileMenu.addSeparator();
fileMenu.add(saveItem);
// (3) Add listeners to menu items
openItem.addActionListener(new OpenAction()); // TODO change
setJMenuBar(menubar);
JToolBar toolbar = new JToolBar("Toolbar", JToolBar.VERTICAL);//);
JButton newb = new JButton("new");
toolbar.add(newb);
add(toolbar, BorderLayout.NORTH);
setTitle(title);
setLocationRelativeTo(null);
pack();
}
// OpenAction
private class OpenAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Menu.this, "Can't Open.");
}
}
}
My problem was that I was the way I was instantiating my JFrame. I was using a helper function like this one:
public static JFrame openInJFrame(Container content, int width, int height,
String title, Color bgColor) {
// ...
frame.setContentPane(content);
frame.setVisible(true);
return (frame);
}
So my JToolBar was getting replaced by the Container object...
Thanks guys! Your answers helped me figure out my problem.
I am making a simple game where numbers fall from top to bottom
and I have to type the number. (number is erased as I type the number)
This is coordinated with a Zen.java which is a JApplet file.
I am trying to make a menu for this game with a typical menu bar.
So far, I've tried this..
public class MenuApplet extends JApplet{
public void init(){
JMenuBar menubar = new JMenuBar();
JMenu menuOption = new JMenu("Option");
JMenuItem NewGame = new JMenuItem("New Game");
menuOption.add(NewGame);
JMenuItem exitGame = new JMenuItem("Exit Game");
menuOption.add(exitGame);
JMenu menuLevel = new JMenu("Level");
JMenuItem levelOne = new JMenuItem("Level One");
JMenuItem levelTwo = new JMenuItem("Level Two");
JMenuItem levelThree = new JMenuItem("Level Three");
}
}
Right before my main method. However, the menu bar doesn't even show up.
I would appreciate a couple of advices.
/* <applet code='MenuApplet' width=200 height=100></applet> */
import javax.swing.*;
public class MenuApplet extends JApplet{
public void init(){
JMenuBar menubar = new JMenuBar();
JMenu menuOption = new JMenu("Option");
JMenuItem NewGame = new JMenuItem("New Game");
menuOption.add(NewGame);
JMenuItem exitGame = new JMenuItem("Exit Game");
menuOption.add(exitGame);
JMenu menuLevel = new JMenu("Level");
JMenuItem levelOne = new JMenuItem("Level One");
JMenuItem levelTwo = new JMenuItem("Level Two");
JMenuItem levelThree = new JMenuItem("Level Three");
// the menu items, menus and menu bar all need
// to be ADDED to something!
menubar.add(menuOption);
menuOption.add(NewGame);
menuOption.add(exitGame);
menubar.add(menuLevel);
menuLevel.add(levelOne);
menuLevel.add(levelTwo);
menuLevel.add(levelThree);
setJMenuBar(menubar);
}
}
You have to add JMenu into JMenuBar and finally use setJMenuBar to set menubar object.
menubar.add(menuOption);
menubar.add(exitGame);
setJMenuBar(menubar);
My code works correctly, except for the submenu. The "Import" button is supposed to expand into newsfeed, bookmarks, and mail. However, the program doesn't even display "Import". It displays the first submenu entry ("newsfeed") which cannot be hovered. What am I doing wrong?
import javax.swing.*;
import java.awt.event.*;
public class test extends JFrame{
private static final long serialVersionUID = 1L;
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
test ex = new test();
ex.setVisible(true);
}
});
}
public test()
{
initGUI();
}
public final void initGUI()
{
JMenuBar menubar = new JMenuBar();
ImageIcon exitIcon = new ImageIcon("icons/exit.png");
ImageIcon openIcon = new ImageIcon("icons/open.png");
ImageIcon newIcon = new ImageIcon("icons/new.png");
ImageIcon saveIcon = new ImageIcon("icons/save.png");
JMenu file = new JMenu("File");
JMenuItem importMenu = new JMenuItem("Import");
importMenu.setMnemonic(KeyEvent.VK_M);
JMenuItem newsfeedMenu = new JMenuItem("Import newsfeed list...");
JMenuItem bookmarksMenu = new JMenuItem("Import bookmarks...");
JMenuItem mailMenu = new JMenuItem("Import mail...");
importMenu.add(newsfeedMenu);
importMenu.add(bookmarksMenu);
importMenu.add(mailMenu);
JMenuItem newMenu = new JMenuItem("New", newIcon);
newMenu.setMnemonic(KeyEvent.VK_N);
newMenu.setToolTipText("Start new document");
JMenuItem openMenu = new JMenuItem("Open", openIcon);
openMenu.setMnemonic(KeyEvent.VK_O);
openMenu.setToolTipText("Open document");
JMenuItem saveMenu = new JMenuItem("Save", saveIcon);
saveMenu.setMnemonic(KeyEvent.VK_S);
saveMenu.setToolTipText("Save document");
JMenuItem exitMenu = new JMenuItem("Exit", exitIcon);
exitMenu.setMnemonic(KeyEvent.VK_X);
exitMenu.setToolTipText("Exit application");
exitMenu.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
System.exit(0);
}
});
exitMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,
KeyEvent.CTRL_MASK));
file.add(newMenu);
file.add(openMenu);
file.add(saveMenu);
file.addSeparator();
file.add(importMenu);
file.addSeparator();
file.add(exitMenu);
menubar.add(file);
setJMenuBar(menubar);
JPanel panel = new JPanel();
getContentPane().add(panel);
panel.setLayout(null);
JButton button = new JButton("Quit");
button.setBounds(100,60,80,40);
button.setToolTipText("Press");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event){
System.exit(0);
}
});
panel.add(button);
setSize(300, 200);
setTitle("testGUI");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
Change it to a JMenu
JMenu importMenu = new JMenu("Import");