0

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);
  }
}
4

2 に答える 2

4

コードを確認しませんでしたが、コンポーネントは親を 1 つしか持つことができません。別のメニュー項目を作成する必要があります (同じ Action オブジェクトを使用する可能性があります)。

于 2012-04-17T16:42:03.507 に答える
2

@Puceは正しいです。代わりに、 を使用Actionして共有機能をカプセル化し、個々のメニュー項目を の共通インスタンスで構築できるようにしますActionFileMenuは簡単な例です。

于 2012-04-17T19:45:59.043 に答える