JPopupMenu getParent () возврат пустого указателя?

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

Пока здесь все не прохладно, проблема со слушателем действия, который, как предполагается, сохранил файл. Для получения графика, я должен получить компонент GraphEditor, таким образом, я делаю компонент Компонента = (Компонент) 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
задан kleopatra 15 December 2011 в 15:03
поделиться

1 ответ

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

2
ответ дан 3 September 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: