Question

I wish to add the same JMenuItems to multiple JMenus, but it only shows up for the last JMenu. Here's the code that I've written. I want the three JMenu items to be shown for all of the JMenu states. With this code the first two states have no JMenuItems, all the three are there only with the last one.

import javax.swing.*;
import java.awt.event.*;  
public class Menu extends JFrame{
  public Menu()
  {
    super("Funky Menu");
JMenu [] states = new JMenu [3];
JMenuItem [] items = new JMenuItem [3];
//Initializing the items
items[0] = new JMenuItem("Industries");
items[0].setMnemonic('I');
items[1] = new JMenuItem("Hill Stations");
items[1].setMnemonic('H');
items[2] = new JMenuItem("Top Institutions");
items[2].setMnemonic('T');
//Initializing the states
//I've set the adjacent keys as the Mnemonics for easy user interaction
//though it is less intuitive, it can vary on the user preference.
states[0] =  new JMenu("Tamil Nadu"); states[0].setMnemonic('Q');
states[1] = new JMenu("West Bengal"); states[1].setMnemonic('W');
states[2] = new JMenu("Haryana"); states[2].setMnemonic('E');
//Adding all the items to each of the states
for(int i=0; i<3; ++i)
{
  for(int j=0; j<3; ++j)
  {
    states[i].add(items[j]);
  }
}
//adding action listener to menu items
for(int j=0; j<3; ++j)
{
  items[j].addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent evt)
  {
    //The next few lines could be clubbed together in one but for
    //clarity sake I write them seperately
    JMenuItem currentItem = (JMenuItem) evt.getSource();
    String textToDisplay = currentItem.getText();
    System.out.println(textToDisplay + " : located in ...");
    //one liner : System.out.println(((JMenuItem) evt.getSource()).getText() + " : located in ...");
  }
  });
}
//finally to fix up the MenuBar
JMenuBar bar = new JMenuBar();
setJMenuBar(bar);
for(int i=0; i<3; ++i)
{
  bar.add(states[i]);
}
getContentPane();
//TODO Create a JLabel add it to the contents
//Instead of writing to the console, update the frames text
setSize(500, 500);
setVisible(true);
 }

  public static void main(String[] args)
  {
    Menu app = new Menu();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
Was it helpful?

Solution

I didn't check your code, but a component can only have one parent. You need to create separate menu items (possibly using the same Action object).

OTHER TIPS

@Puce is correct. Instead, use Action to encapsulate the shared functionality, and let individual menu items be constructed with a common instance of the Action. FileMenu is a simple example.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top