一开始使用 SDK 选项配置 ModuleType

Configuring a ModuleType with the SDK option in the beginning

在我的插件中,我能够构建一个新的项目向导,但第一页看起来不正确。例如。这是我的插件:

这是大多数其他插件所具有的:

我缺少的是 "SDK" 选项。我们的插件需要 Java 8,我希望可以选择一个 SDK 显示在那里。但是我不明白那是在哪里配置的。

这是我的 plugins.xml:

<extensions defaultExtensionNs="com.intellij">
   <!-- moduleBuilder builderClass="com.codename1.plugin.intellij.module.CodenameOneModuleType"/ -->
   <moduleType id="CodenameOne.Module" implementationClass="com.codename1.plugin.intellij.module.CodenameOneModuleType" classpathProvider="true"  />
</extensions>

CodenameOneModuleType 只是扩展了 ModuleType<NewCodenameOneProject>,其中 NewCodenameOneProject 基本上是 JavaModuleBuilder。如果有帮助,我可以 post 更多资源。

顺便说一句,有插件 API 的 javadoc 吗?

我知道来源在哪里但是没有现成的Java文档吗?

我没有找到一个完全明确的解决方案,但我确实根据讨论得出了几个结论 here:

  • 应通过以下方式为项目设置 SDK:ProjectRootManager.getInstance(project).setProjectSdk(jdk);

  • 我可以使用 getCustomOptionsStep

    [=31= 覆盖第一页,而不是覆盖从向导第二页开始的 createWizardSteps ]

一旦我理解了这些,我就使用 IntelliJ/IDEA gui 生成器和一些逻辑重新创建了上面的组合框 UI:

private void refreshSDKCombo(Sdk preferredSdk) {
    DefaultComboBoxModel<Sdk> sdks = new DefaultComboBoxModel<>();
    Sdk[] s = ProjectJdkTable.getInstance().getAllJdks();
    for (Sdk ss : s) {
        if (ss.getSdkType() instanceof JavaSdkType) {
            String str = ss.getVersionString();
            if (str.contains("1.8.") || str.contains("1.9.")) {
                sdks.addElement(ss);
            }
        }
    }
    if(preferredSdk != null) {
        String str = preferredSdk.getVersionString();
        if (str.contains("1.8.") || str.contains("1.9.")) {
            projectSDKCombo.setSelectedItem(preferredSdk);
        }
    }
    projectSDKCombo.setModel(sdks);
    if(sdks.getSize() > 0) {
        projectSDKCombo.setSelectedIndex(0);
    }
}

注意到我将选项限制为 JDK 8+,这是我们的用例所必需的!

我绑定按钮逻辑来配置 SDK:

    newButton.addActionListener(e -> {
        ProjectJdksEditor editor = new ProjectJdksEditor((Sdk)projectSDKCombo.getSelectedItem(),
                ProjectManager.getInstance().getDefaultProject(),
                newButton);
        if (editor.showAndGet()) {
            Sdk selectedJdk = editor.getSelectedJdk();
            refreshSDKCombo(selectedJdk);
        }
    });