【问题标题】:Intellij IDEA plugin - PersistentStateComponent loadState not calledIntellij IDEA 插件 - 未调用 PersistentStateComponent loadState
【发布时间】:2013-06-06 20:25:03
【问题描述】:

我正在尝试为 Intellij IDEA 开发一个插件,我正在使用 SDK 129.451。

我遇到的问题是我无法保留用户数据,例如他可以在插件中输入的一些列表项,并在 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,因为我想保存比简单字符串更复杂的对象。

提前谢谢你!

【问题讨论】:

标签: java intellij-idea plugins persistence intellij-plugin


【解决方案1】:

好的,我成功了! :)

我不知道到底是什么问题,但我将测试类更改为:

@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 中,我将加载 Test 类的方式更改为:

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

我希望它可以帮助其他人..

【讨论】:

    【解决方案2】:

    我已经评论了here,但我会再次说,在我的情况下,由于缺少此示例中 stateValue 的 getter 和 setter,因此未调用 loadState(MyService state):

    class MyService implements PersistentStateComponent<MyService> {
      public String stateValue;
    
      public MyService getState() {
        return this;
      }
    
      public void loadState(MyService state) {
        XmlSerializerUtil.copyBean(state, this);
      }
    }
    

    【讨论】:

      【解决方案3】:

      在我的情况下,甚至在loadState 被调用之前,我就收到了NullPointerException。与上面的代码类似,我使用 Element 类作为状态类。我在Element 类中有一个带有一些参数的构造函数。这是问题所在,因为框架无法创建我的状态类的实例。我试图添加一个没有任何参数的空白构造函数。这行得通。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 2016-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        • 2022-09-23
        相关资源
        最近更新 更多