2013-06-06 2 views
6

Я пытаюсь разработать плагин для Intellij IDEA, я работаю с SDK 129.451.Плагин Intellij IDEA - PersistentStateComponent loadState не называется

Проблема у меня есть, что я не могу сохраняться пользовательские данные, как некоторые элементы списка, он может ввести в плагине и есть данные обратно после IDE перезагружается ..

Я использую PersistentStateComponent, чтобы сохраняться данных, метод getState(), как представляется, называется, но метод loadState() этого не делает.

Вот класс образец, который простирается 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; 

    } 
} 

Также я добавил этот класс в plugin.xml здесь:

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

И у меня есть окно инструментов класс:

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+"); 

      } 
     }); 

} 

Итак, если я закрою приложение или скрою его, метод getState будет вызван, как я ожидал. Но когда я открою приложение, метод loadState не будет вызван .. может кто-нибудь помочь мне, как я могу решить это?

Я уже читал this, но это, похоже, не очень помогает мне. Также я хочу использовать PersistentStateComponent, поскольку я хочу сохранить объекты более сложными, чем простая строка.

Спасибо заранее!

+0

Я добавил ответ на аналогичный вопрос здесь: http://stackoverflow.com/a/41201199/532541 Короче говоря, это, скорее всего, связано с привлечением вашего компонента в

ответ

6

Хорошо, я сделал это! :)

Я не знаю точно, что этот вопрос, но я изменил класс Test к этому:

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

И в TFUploader я изменил способ, которым я загружен класс Тест для этого:

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

Я надеюсь, что это помогает другим ..

1

Я уже комментировал here но опять-таки скажу, что в моем случае Loadstate (MyService состояние) не был вызван из-за отсутствия O е геттер и сеттер для stateValue из этого примера:

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

    public MyService getState() { 
    return this; 
    } 

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

В моем случае я получаю NullPointerException еще до loadState были вызывались. Как и ваш код выше, я использовал класс Element как класс состояния. У меня был конструктор с некоторыми параметрами в классе Element. Это была проблема, так как структура не могла создать экземпляр моего класса состояния. Я попытался добавить пустой конструктор без каких-либо параметров. Это сработало.

Смежные вопросы