2010-06-03 6 views
1

그래, JGraph 예제를 기반으로 Eclipse 플러그인을 만들고있다. 문제는 내가 실제로 "저장"방법을 사용할 수 없다는 것입니다. 여기에 프로그램이 어떻게 작동하는지 간단히 알려 드리겠습니다. - 나는 GraphEditor 객체를 만들고 createFrame() 메소드를 호출하는 init() 메서드로 DiagramEditor 클래스를 가지고 있습니다.) 그 대상의 메드도. - GraphEditor는 JPanel을 확장 한 BasicGraphEditor를 확장하고, createFrame() 메서드는 JFrame을 반환하고 "frame.setJMenuBar (menuBar)"행을 사용합니다. - "menuBar"는 BasicGraphEditor에서 초기화되는 객체 변수입니다.JPopupMenu getParent()는 null을 반환합니까?

여기까지 모든 것이 멋지다. 문제는 파일을 저장해야하는 작업 수신기 때문입니다. 그래프를 얻으려면 GraphEditor 구성 요소를 가져와야합니다. 그래서 Component 구성 요소 = (Component) e.getSource() whitch는 해당 동작 수신기에 전달 된 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에 대한 암시 적 또는 직접적인 참조를 가질 수 있습니다.

이 같은 GraphEdtior 클래스 내부에 SaveAction 클래스를 정의하는 경우 :

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

      .. do whatever 
     } 
} 

당신은 당신의 SaveAction 이미 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 클래스 다음 당신은 단순히 당신이 그것을 구성하고 참조를 개최 할 때 그것에게 GraphEditor를 줄 필요가 다른 클래스 또는 파일에 static으로 정의 또는 정의 된 경우

두 경우 모두 saveAction의 actionPerformed()가 GraphEditor에 액세스하여 필요한 작업을 수행합니다.

관련 문제