2010-06-03 46 views
1

好吧,我正在研究一個基於JGraph示例的Eclipse插件。問題是我無法真正的使用「save」方法,下面是程序如何工作: - 我有一個帶有init()方法的DiagramEditor類,我創建一個GraphEditor對象並調用createFrame( )該對象的方法。 - GraphEditor擴展了BasicGraphEditor(它擴展了JPanel),createFrame()方法返回一個JFrame並有一行「frame.setJMenuBar(menuBar)」 - 「menuBar」是一個對象變量,它在BasicGraphEditor中初始化。JPopupMenu getParent()返回null?

直到這裏一切都很酷,問題是與應該保存文件的動作偵聽器。爲了得到圖形我需要獲取GraphEditor組件,所以我做了一個Component component =(Component)e.getSource(),它是傳遞給該動作偵聽器的ActionEvent,並且在那個階段是JMenuItem「save」,然後我得到父類是JPopupMenu,那麼我想要得到那個應該是GraphEdiotor的JPopupMenu的父類,但是我得到一個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); 

回答

2

菜單附加到框架不是你的類。可能最好的選擇是確保您的SaveAction可以直接看到它的需求。構建SaveAction時,它可以隱式或直接引用GraphEditor。

如果你定義SaveAction類中的GraphEdtior類是這樣的:

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來執行您所需的操作。