I've created a JPopupMenu with two items (add,remove). I want "addItem" to have a sub popup menu. The hierarchy is like this:
add
pizza
cake
...
remove
my code:
JPopupMenu menu = new JPopupMenu();
menu.add(new JMenuItem("remove"));
JMenuItem addItem = new JMenuItem("add");
menu.add(addItem);
addItem.add(new JPopupMenu()); // it is not working for me
Once I move the mouse close to "add item", the menu disappears.
please help me to build this popup menu.
Use a JMenu (sub class of JMenuItem).
JPopupMenu menu = new JPopupMenu();
menu.add(new JMenuItem("remove"));
JMenuItem addItem = new JMenu("add");
menu.add(addItem);
addItem.add(new JMenuItem("pizza"));
addItem.add(new JMenuItem("cake"));
Related
I am working on a project that I will be presenting. So far I have been doing well, but I have ran into a few problems that I can't figure out. I am building a basic GUI. There are 4 sections to choose from. The last menu option does not work. The drop down menu works, but I can't select an option. There is a small black arrow indicating a submenu?
I am having trouble finding what is the cause of that.
Also the GUI only saves one selection at a time. I need it to save all the choices and add everything at the end. What is the best way to accomplish that? If anyone has any input on how to improve my project all advice is welcome! Thank you all for your time and effort. It is much appreciated.
package guiproject;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Guiproject implements ActionListener{
JLabel jlabel;
Guiproject(){
JFrame frame = new JFrame("Vehicle Choices");//create new JFrame container
frame.setLayout(new FlowLayout()); //specify flowlayout for the layout manager
frame.setSize(570,400); // gives the frame its size
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Terminates the program when user closes the application
jlabel = new JLabel();//creates a menu to display menu selections
JMenuBar menu = new JMenuBar();//creates menu bar
JMenu car = new JMenu("Choose Car");//creates field menu items.
JMenuItem sx240 = new JMenuItem("Nissan 240sx = $8,000$");//creates field menu items.
JMenuItem bmw = new JMenuItem(" BMW M5 = $15,000 ");//creates field menu items.
JMenuItem V8 = new JMenuItem(" Corvette = $22,000 ");//creates field menu items.
JMenuItem sky = new JMenuItem(" Skyline = $28,000 ");//creates field menu items.
JMenuItem ford = new JMenuItem(" Shelby Mustang = $25,500 ");//creates field menu items.
car.add(sx240); //add menu items to menu
car.add(bmw);//add menu items to menu
car.add(V8);//add menu items to menu
car.add(sky);//add menu items to menu
car.add(ford);//add menu items to menu
menu.add(car);
JMenu color = new JMenu("Choose Paint Color"); //creates the color selection option
JMenuItem red = new JMenuItem(" Cherry Red = $800.00 "); //craeted color choices
JMenuItem matte = new JMenuItem(" Matte Black = $1,700");//craeted color choices
JMenuItem pink = new JMenuItem(" Hot Pink = $975.00 ");//craeted color choices
JMenuItem purp = new JMenuItem (" Purple = $825.00 ");//craeted color choices
JMenuItem green = new JMenuItem(" Forest Green = $600.00");//craeted color choices
color.add(red); //adds choices to the menu
color.add(matte);//adds choices to the menu
color.add(pink);//adds choices to the menu
color.add(purp);//adds choices to the menu
color.add(green);//adds choices to the menu
menu.add(color);
JMenu drop = new JMenu("Choose Suspension type"); //creates option for suspension
JMenuItem stock = new JMenuItem(" Keep it Stock = $0.0 ");//creates menu choice
JMenuItem spring = new JMenuItem(" Basic Springs and Shocks = $ 150.00 ");//creates menu choice
JMenuItem coil = new JMenuItem(" Coilovers = $1,600 ");//creates menu choice
JMenuItem air = new JMenuItem(" Air Suspension = $ 3,000 ");//creates menu choice
JMenuItem low = new JMenuItem(" Lowering Springs = $575.00 ");//creates menu choice
drop.add(stock);//adds choice to the menu
drop.add(spring);//adds choice to the menu
drop.add(coil);//adds choice to the menu
drop.add(air);//adds choice to the menu
drop.add(low);//adds choice to the menu
menu.add(drop);//adds choice to the menu
JMenu engine = new JMenu("Choose performance parts"); //creates option for menu
JMenuItem stock1 = new JMenu(" Keep It Stock = $0.0 "); //creates menu choice
JMenuItem cam = new JMenu(" Upgrade Camshafts $475.00 ");//creates menu choice
JMenuItem turbo = new JMenu(" Turbo = $1,250.00 ");//creates menu choice
JMenuItem sup = new JMenu(" Supercharger = $2,800.00 ");//creates menu choice
JMenuItem twin = new JMenu(" Twin Turbo = $2,200.00 ");//creates menu choice
engine.add(stock1);//adds choice to the menu
engine.add(cam);//adds choice to the menu
engine.add(turbo);//adds choice to the menu
engine.add(sup);//adds choice to the menu
engine.add(twin);//adds choice to the menu
menu.add(engine);//adds choice to the menu
sx240.addActionListener(this); //adds action listener to menu items
bmw.addActionListener(this);//adds action listener to menu items
V8.addActionListener(this);//adds action listener to menu items
sky.addActionListener(this);//adds action listener to menu items
ford.addActionListener(this);//adds action listener to menu items
red.addActionListener(this);//adds action listener to menu items
matte.addActionListener(this);//adds action listener to menu items
pink.addActionListener(this);//adds action listener to menu items
purp.addActionListener(this);//adds action listener to menu items
green.addActionListener(this);//adds action listener to menu items
stock.addActionListener(this);//adds action listener to menu items
spring.addActionListener(this);//adds action listener to menu items
coil.addActionListener(this);//adds action listener to menu items
air.addActionListener(this);//adds action listener to menu items
low.addActionListener(this);//adds action listener to menu items
stock1.addActionListener(this);//adds action listener to menu items
cam.addActionListener(this);//adds action listener to menu items
turbo.addActionListener(this);//adds action listener to menu items
sup.addActionListener(this);//adds action listener to menu items
twin.addActionListener(this);//adds action listener to menu items
frame.add(jlabel); //adds label to content pane
frame.setJMenuBar(menu);//adds menu bar to frame
frame.setVisible(true);//displays frame
}
public void actionPerformed(ActionEvent ae){// handles menu item action events
String string = ae.getActionCommand();// gets action command to menu section
String string1 = ae.getActionCommand();
if(string.equals("Exit"))System.exit(0);//Exits the program when user chooses exit.
jlabel.setText(string+ " Selected ");//displays selected choice
jlabel.setText(string1+ " selected ");
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new Guiproject();
}
});
}
}
JMenuItem stock1 = new JMenu(" Keep It Stock = $0.0 "); //creates menu choice
JMenuItem cam = new JMenu(" Upgrade Camshafts $475.00 ");//creates menu choice
JMenuItem turbo = new JMenu(" Turbo = $1,250.00 ");//creates menu choice
JMenuItem sup = new JMenu(" Supercharger = $2,800.00 ");//creates menu choice
JMenuItem twin = new JMenu(" Twin Turbo = $2,200.00 ");//creates menu choice
You define your objects a JMenuItem, but you are creating a JMenu. Since JMenu extends JMenuItem, this is legal, but not what you want.
You want:
JMenuItem stock1 = new JMenuItem(" Keep It Stock = $0.0 "); //creates menu choice
JMenuItem cam = new JMenuItem(" Upgrade Camshafts $475.00 ");//creates menu choice
JMenuItem turbo = new JMenuItem(" Turbo = $1,250.00 ");//creates menu choice
JMenuItem sup = new JMenuItem(" Supercharger = $2,800.00 ");//creates menu choice
JMenuItem twin = new JMenuItem(" Twin Turbo = $2,200.00 ");//creates menu choice
I need to create a comboBox with multiple chechboxes in my java swing gui. My first thought was to create a custom comboBox with its own CellRenderer but then I decided to go with a more "friendly" solution and use JMenu with JCheckBox items inside.
The problem is, that when I create the menu and place it inside my JPanel, the menu is not active and it does not open when being clicked. Any ideas what may be the cause of this behavior? Is it even possible to use JMenu like this?
This is a sample of my code:
JMenu menu;
panelCenter.add(new JLabel("Selection"));;
panelCenter.add(prepareSelection(menu));
private JMenu prepareSelection(JMenu menu) {
menu = new JMenu("Select items");
for (int i = 0; i < 10; i++) {
JCheckBoxMenuItem item = new JCheckBoxMenuItem("item " + i);
menu.add(item);
}
return menu;
}
Thanks for any help!
The place to add a JMenuBar is not in the JPanel, but in the layeredPane. You should add the JMenuBar, and it will reside at the top of the layeredPane. The rest of it will be covered by your contentPane. Once the JMenuBar is up you can modify the JMenus and the JMenuItems any time.
Here is a picture from Ivor Horton's Beginning Java:
Solved. First added JMenuBar to my JPanel and then add JMenus to it.
menuBar = new JMenuBar();
prepareSelection(menuInput); // prepare menus
prepareSelection(menuOutput);
panelCenter.add(menuBar);
I have a simple question; I am trying to add a menu to my program. This is what I have thus far:
public static void main(String args[]){
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) {}
JFrame cipherGUIFrame = new CipherGUIFrame();
cipherGUIFrame.setVisible(true);
JMenuBar bar = new JMenuBar();;
JMenu file = new JMenu("File");
JMenu edit = new JMenu("Edit");
JMenuItem open = new JMenuItem("Open");
JMenuItem save = new JMenuItem("Save");
JMenuItem cut = new JMenuItem("Cut");
JMenuItem copy = new JMenuItem("Copy");
JMenuItem paste = new JMenuItem("Paste");
JSeparator sep = new JSeparator();
JMenuItem find = new JMenuItem("Find");
JPopupMenu options = new JPopupMenu("Options");
options.setVisible(true);
file.add(open);
file.add(save);
edit.add(cut);
edit.add(copy);
edit.add(paste);
edit.add(sep);
edit.add(find);
edit.add(options);
bar.add(file);
bar.add(edit);
cipherGUIFrame.setJMenuBar(bar);
}
I am trying to achieve an effect similar to this diagram: http://i.imgur.com/GYi0S9R.jpg .
Is "Options" not the JPopupMenu? It doesn't seem to show up! Or is it simply a JMenuItem and JPopupMenu is the new box that comes up when you hover over it?
A sub menu is just that, a menu which is contained within another menu
Try using something like...
JMenu options = new JMenu("Options");
options.add(new JRadioButtonMenuItem("Forward"));
options.add(new JRadioButtonMenuItem("Backward"));
options.addSeparator();
options.add(new JCheckBoxMenuItem("Case Sensetive"));
Take a closer look at How to Use Menus for more details
I need help with JMenuItem. I didn't write any line about arrow on JMenuItem. So how to disable that? Here's the image:
Let me try to reproduce the issue.
Add JMenuItem in JMenu and then in JMenuBar.
sample code: (No issues)
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("A Menu");
JMenu submenu = new JMenu("A submenu");
JMenuItem menuItem = new JMenuItem("Another item");
submenu.add(menuItem); //comment this line and look the output
menu.add(submenu);
menuBar.add(menu);
Add JMenu directly in JMenuBar without any JMenuItem.
sample code: (This creates problem)
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("A Menu");
JMenu submenu = new JMenu("A submenu");
menu.add(submenu);
menuBar.add(menu);
Add JMenuItem directly in JMenuBar.
sample code: (No issues)
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("A Menu");
JMenuItem menuItem = new JMenuItem("Another item");
menu.add(menuItem);
menuBar.add(menu);
Now the problem is crystal clear, if it's leaf node then add JMenuItem instead of JMenu in JMenuBar.
Read more...
I had the same issue with JavaFX with my MenuItems having arrows all over the place.
Thanks to #Braj response I realized that I was creating my items this way:
MenuItem saveMenu = new Menu();
instead of
MenuItem saveMenu = new MenuItem();
This, of course, works in Java thanks to polymorphism but created this side effect in my app. That being said, this can help you better organize your menus using a tree structure like Save > Save to File / Save to DB / Save As...
I am making a simple java program that represents a Microsoft Word menu bar, and in the file menu I add an exit button... it does nothing.
I need your help to tell me what to do to make the exit button actually exit and close the program.
Here is my code:
public class MicrosoftWordMenu {
public static void main(String [] args)
{
JPanel panel = new JPanel();
JFrame frame = new JFrame("Microsoft Word");
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("File");
JMenu menu1 = new JMenu("Edit");
JMenu menu2 = new JMenu("View");
JMenu menu3 = new JMenu("Insert");
JMenu menu4 = new JMenu("Format");
JMenu menu5 = new JMenu("Tools");
JMenu menu6 = new JMenu("Table");
JMenu menu7 = new JMenu("Window");
JMenu menu8 = new JMenu("Help");
frame.add(bar, BorderLayout.NORTH);
frame.add(panel);
bar.add(menu);
bar.add(menu1);
bar.add(menu2);
bar.add(menu3);
bar.add(menu4);
bar.add(menu5);
bar.add(menu6);
bar.add(menu7);
bar.add(menu8);
JMenuItem menuitem = new JMenuItem("New...");
JMenuItem menuitem1 = new JMenuItem("Open...");
JMenuItem menuitem2 = new JMenuItem("Close");
JMenuItem menuitem3 = new JMenuItem("Save");
JMenuItem menuitem4 = new JMenuItem("Save as...");
JMenuItem menuitem5 = new JMenuItem("Save as web page...");
JMenuItem menuitem6 = new JMenuItem("Web page preview ");
JMenuItem menuitem7 = new JMenuItem("Print ");
JMenuItem menuitem8 = new JMenuItem("Exit");
menu.add(menuitem);
menu.add(menuitem1);
menu.add(menuitem2);
menu.add(menuitem3);
menu.add(menuitem4);
menu.add(menuitem5);
menu.add(menuitem6);
menu.add(menuitem7);
menu.add(menuitem8);
frame.setSize(600,100);
frame.setVisible(true);
}
}
Also consider using Action to let components share functionality, as shown here.
Calling System.exit(0) on menu selection would do just fine.
At the moment you're just creating the GUI element, but they're basically empty shells. In particular, you've created items that appear on the menu, but you haven't added any behaviour to those items. (Since you haven't told your program anywhere what to do when an item is clicked, what did you think would happen)?
In order to provide this behaviour, you'll need to register an ActionListener, which will be called when something happens on an element, and will let you take an appropriate action at that point (such as calling System.exit(0). See the tutorial on Writing [Swing] Event listeners for details.
I always extend the AbstractAction class (which implements the ActionListener interface) which allows you to reuse your actions. By extending the AbstractAction, the actionPerformed(ActionEvent e) method will be invoked very time your button is clicked.
public class CloseAction extends AbstractAction {
public CloseAction() {
super("Close");
}
public actionPerformed(ActionEvent e) {
System.exit(1);
}
}
Now, to apply the above action to one of your buttons, you simply need to follow the below piece of code.
CloseButton.setAction(new CloseAction());
The close button will now shut down your application each time it gets pressed.
Use the ExitAction defined in Closing an Application. Then clicking on the Exit menu item will be just like clicking on the Close icon at the top right of the window. This allows for consistency when closing an application in case you ever need to do close processing.
Edit:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
...
// JMenuItem menuitem8 = new JMenuItem("Exit");
JMenuItem menuitem8 = new JMenuItem( new ExitAction() );