2009-09-06 78 views
26

是否有一个eclipse插件,它允许我从界面快速生成一个新类?从eclipse中的界面快速创建类

而不是必须做打字的新一类的对话框

理想让我选择一个标准名称,如默认地将Impl才能产生

+1

“新阶级”对话框不够快的吗? – skaffman 2009-09-06 18:53:19

+5

以史诗级别懒惰 – laurie 2009-09-06 20:21:16

+2

很明显,但我不明白它是如何比现在更快......您键入类名称,选择接口,然后向导将生成该接口的默认实现。 ..怎么可能更快? – skaffman 2009-09-06 20:35:19

回答

4

我还没有看到这样做的任何插件,但它似乎是一个合理的捷径。

以下内容可以构成插件直接从选定界面生成类的基础。它适用于我的盒子(TM)。

它目前假定该类将接口名称后缀为“Impl”,如果该类型已存在,则会失败(记录原因)。

一些改进,我能想到的:

  • 允许多个接口
  • 选择定义一个首选项页面的执行后缀和包名
  • 打开使用,如果“默认填充值的对话“实现已经存在

该插件为编辑器,视图和文本选择的上下文菜单添加一个命令,禁用该项目ection不解析为接口。它也可以用ctrl-6激活(你可以很明显地改变plugin.xml中的键绑定以适合你的心情)。

插件代码如下:

package name.seller.rich.classwizard.actions; 

import java.util.Collections; 

import org.eclipse.core.commands.AbstractHandler; 
import org.eclipse.core.commands.ExecutionEvent; 
import org.eclipse.core.commands.ExecutionException; 
import org.eclipse.core.expressions.EvaluationContext; 
import org.eclipse.core.resources.IFile; 
import org.eclipse.core.resources.IResource; 
import org.eclipse.core.runtime.CoreException; 
import org.eclipse.core.runtime.NullProgressMonitor; 
import org.eclipse.jdt.core.ICompilationUnit; 
import org.eclipse.jdt.core.IJavaElement; 
import org.eclipse.jdt.core.IType; 
import org.eclipse.jdt.core.JavaModelException; 
import org.eclipse.jdt.internal.ui.JavaPlugin; 
import org.eclipse.jdt.internal.ui.actions.SelectionConverter; 
import org.eclipse.jdt.ui.wizards.NewClassWizardPage; 
import org.eclipse.jface.viewers.IStructuredSelection; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.ui.IWorkbenchPage; 
import org.eclipse.ui.IWorkbenchPart; 
import org.eclipse.ui.IWorkbenchWindow; 
import org.eclipse.ui.PartInitException; 
import org.eclipse.ui.handlers.HandlerUtil; 
import org.eclipse.ui.ide.IDE; 
import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; 

public class GenerateClassHandler extends AbstractHandler { 

    public GenerateClassHandler() { 
    } 

    public Object execute(ExecutionEvent event) throws ExecutionException { 
     NewClassWizardPage page = new NewClassWizardPage(); 

     EvaluationContext evaluationContext = (EvaluationContext) event 
       .getApplicationContext(); 

     IWorkbenchPart activePart = (IWorkbenchPart) evaluationContext 
       .getVariable("activePart"); 
     try { 
      IStructuredSelection selection = SelectionConverter 
        .getStructuredSelection(activePart); 

      IType type = getFirstType(selection); 

      if (type != null && type.exists() && type.isInterface()) { 
       page.init(selection); 

       String typeName = type.getElementName() + "Impl"; 
       // TODO handle existing type 
       page.setTypeName(typeName, true); 

       // generate constructors and methods, allow modification 
       page.setMethodStubSelection(false, true, true, true); 

       page.setSuperInterfaces(Collections.singletonList(type 
         .getFullyQualifiedName()), true); 
       try { 
        page.createType(new NullProgressMonitor()); 

        IResource resource = page.getModifiedResource(); 
        if (resource != null) { 
         IWorkbenchWindow window = HandlerUtil 
           .getActiveWorkbenchWindowChecked(event); 
         BasicNewResourceWizard 
           .selectAndReveal(resource, window); 
         openResource((IFile) resource, window); 
        } 
       } catch (CoreException e) { 
        // TODO if we get this the type already exists, open a 
        // dialogue to allow the type name to be modified or give 
        // up? 
        logException(e); 
       } 

      } 
     } catch (JavaModelException e) { 
      logException(e); 
     } catch (InterruptedException e) { 
      logException(e); 
     } 
     return null; 
    } 

    protected void openResource(final IFile resource, 
      IWorkbenchWindow window) { 
     final IWorkbenchPage activePage = window.getActivePage(); 
     if (activePage != null) { 
      final Display display = window.getShell().getDisplay(); 
      if (display != null) { 
       display.asyncExec(new Runnable() { 
        public void run() { 
         try { 
          IDE.openEditor(activePage, resource, true); 
         } catch (PartInitException e) { 
          logException(e); 
         } 
        } 
       }); 
      } 
     } 
    } 

    @Override 
    public void setEnabled(Object context) { 
     if (context != null && context instanceof EvaluationContext) { 
      EvaluationContext evaluationContext = (EvaluationContext) context; 

      IWorkbenchPart activePart = (IWorkbenchPart) evaluationContext 
        .getVariable("activePart"); 

      try { 
       IStructuredSelection selection = SelectionConverter 
         .getStructuredSelection(activePart); 

       IType type = getFirstType(selection); 

       if (type != null) { 
        setBaseEnabled(type.isInterface()); 
        return; 
       } 
      } catch (JavaModelException e) { 
       logException(e); 
      } 
     } 

     setBaseEnabled(false); 
    } 

    private IType getFirstType(IStructuredSelection selection) { 
     IJavaElement[] elements = SelectionConverter.getElements(selection); 

     if (elements != null && elements.length > 0) { 
      if (elements[0] != null && elements[0] instanceof IType) { 
       return (IType) elements[0]; 
      } 

      try { 
       if (elements[0] != null 
         && elements[0] instanceof ICompilationUnit) { 
        IType[] types = ((ICompilationUnit) elements[0]) 
          .getAllTypes(); 

        if (types != null && types.length > 0) { 
         return types[0]; 
        } 
       } 
      } catch (JavaModelException e) { 
       logException(e); 
      } 
     } 
     return null; 
    } 

    protected void logException(Exception e) { 
     JavaPlugin.log(e); 
    } 
} 

有助于该命令的plugin.xml的是:

<?xml version="1.0" encoding="UTF-8"?> 
<?eclipse version="3.0"?> 
<plugin> 
    <extension 
    point="org.eclipse.ui.commands"> 
     <command 
     name="Generate Class" 
     categoryId="name.seller.rich.classwizard.category" 
     id="name.seller.rich.classwizard.generateClassCommand"> 
     </command> 
    </extension> 
    <extension 
    point="org.eclipse.ui.handlers"> 
     <handler 
     commandId="name.seller.rich.classwizard.generateClassCommand" 
     class="name.seller.rich.classwizard.actions.GenerateClassHandler"> 
     </handler> 
    </extension> 
    <extension 
    point="org.eclipse.ui.bindings"> 
     <key 
     commandId="name.seller.rich.classwizard.generateClassCommand" 
     contextId="org.eclipse.ui.contexts.window" 
     sequence="M1+6" 
     schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"> 
     </key> 
    </extension> 
    <extension 
    point="org.eclipse.ui.menus"> 
     <menuContribution 
     locationURI="popup:org.eclipse.ui.popup.any?after=additions"> 
    <command 
      commandId="name.seller.rich.classwizard.generateClassCommand" 
      mnemonic="G"> 
    </command> 
     </menuContribution> 
    </extension> 
</plugin> 

和MANIFEST.MF看起来像这样:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Classwizard 
Bundle-SymbolicName: name.seller.rich.classwizard; singleton:=true 
Bundle-Version: 1.0.0 
Require-Bundle: org.eclipse.ui, 
org.eclipse.core.runtime, 
org.eclipse.jdt.core;bundle-version="3.5.0", 
org.eclipse.core.expressions;bundle-version="3.4.100", 
org.eclipse.jface.text;bundle-version="3.5.0", 
org.eclipse.jdt.ui;bundle-version="3.5.0", 
org.eclipse.ui.ide;bundle-version="3.5.0", 
org.eclipse.ui.editors;bundle-version="3.5.0", 
org.eclipse.core.resources;bundle-version="3.5.0" 
Eclipse-AutoStart: true 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
36

没有带其他见过比:右键单击接口类型在包浏览器中,选择New-> Class,它将自动实现该接口。你仍然必须自己命名新课程。

+0

不起作用。你错了。 – user710818 2011-11-02 06:42:25

+30

@ user710818您可能是右键单击Package Explorer中的.java文件,而不是类型(即只展开包含该接口的.java文件,并右键单击接口类型,选择New-> Class)。至少在Indigo和Helios中这是完美的。 – nos 2011-11-02 08:32:06

+2

@nos谢谢,它也适用于Luna – 2015-04-10 09:00:09

7

实际上,它是尽快问as 2002

重构应提取所有(开关“全部公开”)从一个类的方法 ,创建一个接口和老班 重命名为类名默认地将Impl

...并输入为feature request,“解决”,在ticket 9798,因为新建 - >类将有选择‘继承抽象方法’(因为至少Eclipse SDK 2.1 2003)供您才能选择自动实现这些公共抽象方法。

alt text

+0

你是贡献者吗?你真的好像对此非常了解:) – javamonkey79 2009-09-07 00:17:31

+0

@ javamonkey79:nope,但是一些真正的eclipse贡献者会回答这个问题:请参阅这个答案(及其评论):http://stackoverflow.com/questions/1363584/eclipse-improve-debugging-display-vairable-values-on-mouseover/1363640#1363640 – VonC 2009-09-07 04:05:39

+2

我想看到的是在“实施”列表中预填充了我选择的界面的新建类对话框。 – Arkadiy 2011-11-23 20:50:33

3

如果你创建一个类,让它实现一个接口。

您会收到错误,因为方法未定义。只需按Ctrl-1或右键,就可以根据需要创建所有方法,包括TODO,javadoc注释等等(取决于Eclipse的配置方式)。

0

方法1:右键单击班级名称,然后选择“快速修复”,一个然后会出现一个小菜单,您可以在其中选择:“添加未实现的方法”。

方法2:右键单击类名,进入“源”,然后选择“覆盖/实现方法”