2013-06-06 5 views
6

Ich versuche ein Plugin für Intellij IDEA zu entwickeln, ich arbeite mit SDK 129.451.Intellij IDEA Plugin - PersistentStateComponent loadState nicht aufgerufen

Das Problem, das ich habe ist, dass ich nicht die Benutzerdaten wie einige Listenelemente er Eingabe der Daten in das Plugin und haben zurück, nachdem die IDE Neustarts bestehen bleiben kann ..

ich PersistentStateComponent bin mit der fortbestehen Daten, scheint die getState() Methode aufgerufen werden, aber die loadState() Methode nicht. Hier

ist eine Beispielklasse, die PersistentStateComponent erweitert:

@State(name = "Test", storages = {@Storage(file = StoragePathMacros.APP_CONFIG+"/other.xml" 
)}) 
public class Test implements PersistentStateComponent<Element> { 

    String ceva; 

    public Test() { 
     ceva = "sad"; 
     System.out.println("constr"); 
    } 

    public String getCeva() { 
     return ceva; 
    } 

    public void setCeva(String ceva) { 
     this.ceva = ceva; 
    } 

    public void loadState(Element state) { 
     System.out.println("cstate load"); 

     ceva = (String) state.getContent().get(0); 

    } 

    public Element getState() { 
     System.out.println("cstate retu"); 
     Element configurationsElement = new Element("testtt"); 
     configurationsElement.addContent(ceva); 
     return configurationsElement; 

    } 
} 

Auch ich diese Klasse in plugin.xml hier hinzugefügt:

<extensions defaultExtensionNs="com.intellij"> 
    <applicationService serviceImplementation="ro.catalin.prata.testflightuploader.controller.Test"/> 
    <!-- Add your extensions here --> 
    <toolWindow id="TF Uploader" secondary="true" icon="/general/add.png" anchor="right" 
       factoryClass="ro.catalin.prata.testflightuploader.view.TFUploader"> 
    </toolWindow> 
</extensions> 

Und ich habe auch ein Werkzeugfenster Klasse:

public class TFUploader implements ToolWindowFactory { 

    private JButton buttonAction; 
    private ToolWindow myToolWindow; 

    final Test test = ServiceManager.getService(Test.class); 

    public TFUploader() { 

     // I assume it should print the saved string but it doesn't 
     System.out.println(test.getCeva()); 

     buttonAction.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       // if I click a button I am setting some new value to the string I want to save 
       test.setCeva(test.getCeva() + "-dddddd+"); 

      } 
     }); 

} 

Ok, wenn ich die App schließe oder sie minimiere, wird die getState Methode wie erwartet aufgerufen .. aber wenn ich die App öffne, wird die loadState Methode nicht aufgerufen .. kann mir jemand helfen, wie ich das lösen kann Dies?

Ich lese bereits this, aber es scheint mir nicht zu viel zu helfen. Ich möchte auch PersistentStateComponent verwenden, wie ich Objekte komplexer als ein einfacher String speichern möchte.

Vielen Dank im Voraus!

+0

Ich habe Antwort auf ähnliche Frage hier hinzugefügt: http://StackOverflow.com/a/41201199/532541 Kurz gesagt, dies ist wahrscheinlich aufgrund der Eintragung Ihrer Komponente in

Antwort

6

Ok, ich habe es geschafft! :)

Ich weiß nicht genau, was das Problem war, aber ich änderte sich die Test-Klasse dazu:

@State(
     name = "Test", storages = { 
     @Storage(
       id = "other", 
       file = "$APP_CONFIG$/testpersist.xml") 
}) 
public class Test implements PersistentStateComponent<Test> { 

    String ceva; 

    public Test() { 
     ceva = "sad"; 
     System.out.println("constr"); 
    } 

    public String getCeva() { 
     return ceva; 
    } 

    public void setCeva(String ceva) { 
     this.ceva = ceva; 
    } 

    public void loadState(Test state) { 
     System.out.println("cstate load"); 

     XmlSerializerUtil.copyBean(state, this); 
    } 

    public Test getState() { 
     System.out.println("cstate retu"); 
     return this; 
    } 
} 

Und im TFUploader änderte ich die Art, wie ich die Test-Klasse dazu geladen:

final Test test = ServiceManager.getService(Test.class); 

ich hoffe, dass es anderen hilft ..

1

ich bereits here kommentiert haben, werden aber wieder sagen, dass in meinem Fall loadstate (MyService Zustand) wurde nicht wegen des Mangels genannt o f Getter und Setter für stateValue aus diesem Beispiel:

class MyService implements PersistentStateComponent<MyService> { 
    public String stateValue; 

    public MyService getState() { 
    return this; 
    } 

    public void loadState(MyService state) { 
    XmlSerializerUtil.copyBean(state, this); 
    } 
} 
0

In meinem Fall war ich immer ein NullPointerException noch bevor loadState war immer genannt. Ähnlich wie bei Ihrem Code oben habe ich eine Element Klasse als State-Klasse verwendet. Ich hatte einen Konstruktor mit einigen Parametern in Element Klasse. Dies war das Problem, da das Framework keine Instanz meiner Statusklasse erstellen konnte. Ich habe versucht, einen leeren Konstruktor ohne Parameter hinzuzufügen. Das hat funktioniert.