JPopupMenu getParent () возвращает ноль? - PullRequest
1 голос
/ 03 июня 2010

Хорошо, я работаю над плагином Eclipse, основанным на примере JGraph. Проблема в том, что я не могу заставить метод «save» работать, вот как работает программа вкратце: - У меня есть класс DiagramEditor с методом init (), где я создаю объект GraphEditor и вызываю метод createFrame () этого объекта. - GraphEditor расширяет BasicGraphEditor (который расширяет JPanel), метод createFrame () возвращает JFrame и имеет строку «frame.setJMenuBar (menuBar)» - «menuBar» - это переменная объекта, которая инициализируется в BasicGraphEditor.

До сих пор все круто, проблема в слушателе действий, который должен сохранить файл. Чтобы получить график, мне нужно получить компонент GraphEditor, поэтому я делаю компонент Component = (Component) e.getSource (), который представляет собой ActionEvent, переданный этому слушателю действия, а на этом этапе JMenuItem «сохраняет», затем я получаю родитель, который является JPopupMenu, тогда я хочу получить родителя этого JPopupMenu, который должен быть GraphEdiotor, но вместо этого я получаю ноль. Есть идеи почему?

Вот некоторый исходный код:

    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 Ответ

2 голосов
/ 04 июня 2010

Меню прикреплено к рамке не вашего класса. Вероятно, лучший вариант - убедиться, что ваш 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 
        }
}

В обоих случаях ваше actionPerformed () в вашем saveAction будет иметь доступ к GraphEditor, чтобы делать то, что вам нужно.

...