2013-06-06 21 views
6

Próbuję opracować wtyczkę dla Intellij IDEA, pracuję z SDK 129.451.Intellij IDEA plugin - PersistentStateComponent loadState nie nazywane

Problem mam to, że nie mogę się utrzymywać dane użytkownika jak niektórych elementów listy może on wejście we wtyczce i mieć dane z powrotem po ponownym uruchomieniu IDE ..

Używam PersistentStateComponent do utrwalania danych, metoda getState() wydaje się być wywoływana, ale metoda loadState() nie.

Oto próbka klasa, która rozszerza PersistentStateComponent:

@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; 

    } 
} 

także dodałem tej klasy w plugin.xml tutaj:

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

I ja też mam okno narzędzia klasa:

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, jeśli zamknę aplikację lub zminimalizuję ją, metoda getState zostanie wywołana tak, jak się spodziewałem .. ale kiedy otwieram aplikację, metoda loadState nie jest wywoływana .. czy ktoś mi pomoże, jak mogę rozwiązać to?

Już przeczytałem this, ale wydaje mi się, że niewiele mi to pomaga. Również chcę użyć PersistentStateComponent, ponieważ chcę zapisać obiekty bardziej złożone niż prosty ciąg.

Z góry dziękuję!

+0

Dodałem odpowiedź na podobne pytanie tutaj: http://stackoverflow.com/a/41201199/532541 W skrócie, jest to najprawdopodobniej spowodowane zarejestrowaniem twojego komponentu w

Odpowiedz

6

Ok, udało się! :)

Nie wiem dokładnie, co było problemem, ale zmieniłem klasę testową do tego:

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

A w TFUploader Zmieniłem sposób załadowałem klasę testową do tego:

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

mam nadzieję, że pomaga innym ..

1

już skomentował here ale powiem jeszcze, że w moim przypadku LoadState (stan MyService) nie został wezwany z powodu braku o f getter i setter dla stateValue z tego przykładu:

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

    public MyService getState() { 
    return this; 
    } 

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

W moim przypadku był już NullPointerException nawet przed loadState był już nazywany. Podobnie jak w powyższym kodzie użyłem klasy Element jako klasy stanu. Miałem konstruktora z niektórymi parametrami w klasie Element. To był problem, ponieważ struktura nie mogła utworzyć instancji mojej klasy państwowej. Próbowałem dodać pusty konstruktor bez żadnych parametrów. To zadziałało.