Frage

Ok, ich arbeite an einem Eclipse -Plugin, das auf dem Beispiel für JGRAPH basiert. Das Problem ist, dass ich die "Speichern" -Methode nicht wirklich zum Laufen bringen kann. So funktioniert das Programm kurz: - Ich habe eine Diagramitor -Klasse mit einer Init () -Methode, bei der ich ein Grapheditor -Objekt erstelle und den createFrame () aufrufe () Methord dieses Objekts. - Grapheditor erweitert den BasicGrapheditor (der JPanel erweitert), die Methode createFrame () gibt einen JFRame zurück und hat eine Zeile "Frame.SetjMenubar (MenuBar)" - Die "Menubar" ist eine Objektvariable, die im BasicGrapheditor initialisiert wird.

Bis hier ist alles cool, das Problem ist mit dem Action -Hörer, der eine Datei speichern soll. Um das Diagramm zu erhalten, muss ich die Grapheditor -Komponente abrufen. Ich mache also eine Komponentenkomponente = (Komponente) e.getSource () whitch ist der an diesen Aktionshörer übergebene Action -Event und in dieser Phase ist das JMenuitem "Save", dann bekomme ich dann ich Der übergeordnete Elternteil, der das JPOPUPMENU ist, möchte ich das übergeordnete JPopupMenus übernehmen, was der Graphöotor sein sollte, aber stattdessen bekomme ich einen Null. Irgendeine Idee warum?

Hier ist ein Quellcode:

    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);
War es hilfreich?

Lösung

Das Menü ist an den Rahmen nicht an Ihre Klasse angehängt. Wahrscheinlich ist die beste Option, sicherzustellen, dass Ihre Savaction direkt erkennen kann, was sie direkt benötigt. Wenn Sie Ihre Savaction konstruieren, kann sie einen impliziten oder direkten Verweis auf den Grapheditor haben.

Wenn Sie Ihre Savaction -Klasse in der graphedtior -Klasse wie folgt definieren:

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

            .. do whatever 
        }
}

Sie sehen, dass Ihre Savaction bereits Zugriff auf den Grapheditor hat (eine implizite Referenz).

Wenn Ihre Savaction -Klasse als definiert ist als static, oder in einer anderen Klasse oder Datei definiert, dann müssen Sie ihm lediglich den Grapheditor geben, wenn Sie ihn konstruieren und die Referenz halten:

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

In beiden Fällen hat Ihr Action -Performed () in Ihrem Rettungsvermögen Zugriff auf den Grapheditor, um das zu tun, was Sie benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top