JPopupMenu getParent()返回null?

时间:2010-06-03 18:40:40

标签: java swing actionlistener

好的,所以我正在开发一个基于JGraph示例的Eclipse插件。问题是我无法真正实现“保存”方法,这里是程序的简单工作方式: - 我有一个带有init()方法的DiagramEditor类,我在其中创建一个GraphEditor对象并调用该对象的createFrame()方法。 - GraphEditor扩展了BasicGraphEditor(扩展了JPanel),createFrame()方法返回一个JFrame并且有一行“frame.setJMenuBar(menuBar)” - “menuBar”是一个对象变量,在BasicGraphEditor中初始化。

直到这里一切都很酷,问题在于应该保存文件的动作监听器。为了获得图形,我需要获取GraphEditor组件,所以我做了一个Component组件=(组件)e.getSource()whitch是传递给该动作监听器的ActionEvent,在那个阶段是JMenuItem“保存”,然后我得到作为JPopupMenu的父级,然后我想得到JPopupMenu的父级,它应该是GraphEdiotor,但我得到一个null。知道为什么吗?

以下是一些源代码:

    DiagramEditor.java:

    @Override
public void init(IEditorSite site, IEditorInput input)
        throws PartInitException {
    setSite(site);
    setInput(input);
    this.diagram = ((DiagramEditorInput)input).getDiagram();
    setPartName(this.diagram.getName());

    gEditor = new GraphEditor();
    gEditor.createFrame().setVisible(true);
}

    BasicGraphEditor.java:

    public JFrame createFrame()
{
    JFrame frame = new JFrame();
    frame.getContentPane().add(this);
    frame.setJMenuBar(menuBar);
    //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(870, 640);
    return frame;
}

    In the constructor:

    menuBar = new JMenuBar();

    menu = new JMenu("File");
    menu.setMnemonic(KeyEvent.VK_F);
    menuBar.add(menu);

    JMenuItem openMenuItem = new JMenuItem("Open", KeyEvent.VK_O);
    // ADD FILE OPENING
    //openMenuItem.addActionListener(menuListener);
    menu.add(openMenuItem);


    JMenuItem saveMenuItem = new JMenuItem("Save", new ImageIcon("/images/save.gif"));
    saveMenuItem.setMnemonic(KeyEvent.VK_S);
    saveMenuItem.addActionListener( new SaveAction(false) );
    menu.add(saveMenuItem);
   // menu.add(new SaveAction(false));

    JMenuItem saveMenuItemAs = new JMenuItem("SaveAs", new ImageIcon("/images/saveas.gif"));
    //saveMenuItemAs.setMnemonic(KeyEvent.VK_S);
    saveMenuItemAs.addActionListener( new SaveAction(true) );
    menu.add(saveMenuItemAs);
    //menu.add(new SaveAction(true));       

    JMenuItem closeMenuItem = new JMenuItem("Close", KeyEvent.VK_C);
    closeMenuItem.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            }
    );
    menu.add(closeMenuItem);

1 个答案:

答案 0 :(得分:2)

菜单附在框架而不是您的班级。可能最好的选择是确保您的SaveAction可以直接看到它需要的东西。构造SaveAction时,它可以对GraphEditor进行隐式或直接引用。

如果您将GraphAdtior类中的SaveAction类定义为:

class SaveAction extends AbstractAction
{
        public void actionPerformed(ActionEvent e) {
            GraphEditor myGE = GraphEditor.this;

            .. do whatever 
        }
}

您将看到您的SaveAction已经可以访问GraphEditor(隐式引用)。

如果您的SaveAction类被定义为static,或者在另一个类或文件中定义,那么您只需在构造它时为其提供GraphEditor并使其保持引用:

class SaveAction extends AbstractAction
{
    private GraphEditor graphEditor;
    private boolean myBoolean;

    public SaveAction(GraphEditor graphEditor, boolean myBoolean)
    {
        this.myBoolean = myBoolean;
        this.graphEditor = graphEditor;
    }

        public void actionPerformed(ActionEvent e) {

            this.graphEditor....
            .. do whatever 
        }
}

在这两种情况下,saveAction中的actionPerformed()都可以访问GraphEditor来执行您需要的操作。