import java.awt.*;
import java.awt.event.*;
import java.security.KeyStore;import javax.swing.*;import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class MenuTest {
public static void main(String[]args){
EventQueue.invokeLater(new Runnable(){
public void run(){
MenuFrame f=new MenuFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
});
}}
class MenuFrame extends JFrame{
public MenuFrame(){
setTitle("MenuTest");
setSize(200,200);
JMenu fileMenu=new JMenu("File");
fileMenu.add(new TestAction("New"));

JMenuItem openItem=fileMenu.add(new TestAction("Open"));
openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl o"));
fileMenu.addSeparator();

saveAction=new TestAction("Save");
JMenuItem saveItem=fileMenu.add(saveAction);
saveItem.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));

saveAsAction=new TestAction("Save As");
fileMenu.add(saveAsAction);
fileMenu.addSeparator();

fileMenu.add(new AbstractAction("Exit"){
public void actionPerformed(ActionEvent event){
System.exit(0);
}
});

readonlyItem=new JCheckBoxMenuItem("Read-only");
readonlyItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
boolean saveOk=!readonlyItem.isSelected();
saveAction.setEnabled(saveOk);
saveAsAction.setEnabled(saveOk);
}
});

ButtonGroup group=new ButtonGroup();

JRadioButtonMenuItem insertItem=new JRadioButtonMenuItem("Insert");
insertItem.setSelected(true);
JRadioButtonMenuItem overtypeItem=new JRadioButtonMenuItem("Overtype");

group.add(insertItem);
group.add(overtypeItem);


Action cutAction=new TestAction("Cut");
cutAction.putValue(Action.SMALL_ICON, new ImageIcon("cut.gif"));
Action copyAction=new TestAction("Copy");
copyAction.putValue(Action.SMALL_ICON, new ImageIcon("copy.gif"));
Action pasteAction=new TestAction("Paste");
pasteAction.putValue(Action.SMALL_ICON,new ImageIcon("paste.gif"));
JMenu editMenu=new JMenu("Edit");
editMenu.add(cutAction);
editMenu.add(copyAction);
editMenu.add(pasteAction);

JMenu optionMenu=new JMenu("Options");

optionMenu.add(readonlyItem);
optionMenu.addSeparator();
optionMenu.add(insertItem);
optionMenu.add(overtypeItem);

editMenu.addSeparator();
editMenu.add(optionMenu);

JMenu helpMenu=new JMenu("Help");
helpMenu.setMnemonic('H');

JMenuItem indexItem=new JMenuItem("Index");
indexItem.setMnemonic('I');
helpMenu.add(indexItem);

Action aboutAction=new TestAction("About");
aboutAction.putValue(Action.MNEMONIC_KEY,new Integer('A'));
helpMenu.add(aboutAction);

JMenuBar menuBar=new JMenuBar();
setJMenuBar(menuBar);


menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(helpMenu);

popup=new JPopupMenu();
popup.add(cutAction);
popup.add(copyAction);
popup.add(pasteAction);

JPanel panel=new JPanel();
panel.setComponentPopupMenu(popup);
add(panel);

panel.addMouseListener(new MouseAdapter(){
});
}

private Action saveAction;
private Action saveAsAction;
private JCheckBoxMenuItem readonlyItem;
private JPopupMenu popup;
}
class TestAction extends AbstractAction{
public TestAction(String name){
super(name);
}
public void actionPerformed(ActionEvent event){
System.out.println(getValue(Action.NAME)+"selected.");
}
}
这段代码没有错误,但运行时出现Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding container's parent to itself
at java.awt.Container.checkAddToSelf(Container.java:420)
at java.awt.Container.addImpl(Container.java:1038)
at java.awt.Container.add(Container.java:365)
at ToolBarFrame.<init>(ToolBarTest.java:49)
at ToolBarTest$1.run(ToolBarTest.java:8)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
请高手赐教,一般遇到类似的问题时该怎么处理呢???谢谢