2010-06-03 8 views
1

Ok, donc je travaille sur un plugin Eclipse basé sur l'exemple JGraph. Le problème est que je ne peux pas vraiment faire fonctionner la méthode "save", voici comment le programme fonctionne: - J'ai une classe DiagramEditor avec une méthode init(), où je crée un objet GraphEditor et appelle le createFrame () methord de cet objet. - GraphEditor étend le BasicGraphEditor (qui étend JPanel), la méthode createFrame() renvoie un JFrame et a une ligne "frame.setJMenuBar (menuBar)" - le "menuBar" est une variable d'objet qui est initialisée dans BasicGraphEditor. Jusqu'à ce que tout soit cool, le problème est avec l'écouteur d'action qui est censé enregistrer un fichier. Pour obtenir le graphique, j'ai besoin du composant GraphEditor, donc je fais un composant Component = (Component) e.getSource() qui est l'ActionEvent passé à ce listener d'action et à ce stade est le JMenuItem "save", alors je reçois le parent qui est le JPopupMenu, alors je veux obtenir le parent de ce JPopupMenu qui devrait être le GraphEdiotor, mais à la place je reçois un null. Une idée pourquoi?JPopupMenu getParent() retourne une valeur nulle?

Voici quelques code source:

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

Répondre

2

Le menu est fixé au châssis pas votre classe. Probablement la meilleure option est de s'assurer que votre SaveAction peut voir ce dont il a besoin directement. Lorsque vous construisez votre SaveAction, il peut avoir une référence implicite ou directe à GraphEditor.

Si vous définissez votre classe SaveAction dans la classe GraphEdtior comme ceci:

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

      .. do whatever 
     } 
} 

Vous verrez votre SaveAction a déjà accès à la GraphEditor (une référence implicite).

Si votre classe SaveAction est définie comme static ou défini dans une autre classe ou d'un fichier, il vous suffit de lui donner le GraphEditor lorsque vous construisez et faire tenir la référence:

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 
     } 
} 

En Dans les deux cas, votre actionPerformed() dans votre saveAction aura accès à GraphEditor pour faire ce dont vous avez besoin.

Questions connexes