在上一篇中,我們已經建立了一個向導想生成項目,這一篇中將介紹怎樣在Eclipse透視圖中建立一個項目及所需的東西。
首先,我們在向導點擊Finish完后,然后生成一個項目,如圖:

這里就不多說了,貼出代碼出來:

NewCodeGenWizard
1
/** *//**
2
* @see org.eclipse.jface.wizard.Wizard#performFinish()
3
*/
4
public boolean performFinish()
{
5
createJavaProject();
6
if (_newProject == null)
{
7
return false;
8
} else
{
9
updatePerspective();
10
selectAndReveal(_newProject);
11
return true;
12
}
13
}
14
15
/** *//**
16
* 創建一個Java項目
17
*/
18
public void createJavaProject()
{
19
_newProject = createNewProject();
20
IJavaProject ijavaproject = JavaCore.create(_newProject);
21
try
{
22
createOutputLocation(ijavaproject);
23
addJavaBuilder(ijavaproject);
24
setClasspath(ijavaproject);
25
_newProject.build(IncrementalProjectBuilder.FULL_BUILD, null);
26
} catch (JavaModelException e)
{
27
e.printStackTrace();
28
} catch (CoreException e)
{
29
e.printStackTrace();
30
}
31
}
32
33
/** *//**
34
* 創建一個新項目
35
*
36
* @return
37
*/
38
private IProject createNewProject()
{
39
if (_newProject != null)
40
return _newProject;
41
42
// 得到一個項目的句柄
43
final IProject newProjectHandle = _mainPage.getProjectHandle();
44
45
// 得到一個項目的描述
46
IPath newPath = null;
47
if (!_mainPage.useDefaults())
48
newPath = _mainPage.getLocationPath();
49
50
IWorkspace workspace = ResourcesPlugin.getWorkspace();
51
final IProjectDescription description = workspace
52
.newProjectDescription(newProjectHandle.getName());
53
description.setLocation(newPath);
54
55
// 增加Java Nature,否則在ijavaproject.setOutputLocation這句就會出錯
56
addJavaNature(description);
57
58
// 創建一個項目的操作
59
WorkspaceModifyOperation op = new WorkspaceModifyOperation()
{
60
protected void execute(IProgressMonitor monitor)
61
throws CoreException
{
62
createProject(description, newProjectHandle, monitor);
63
}
64
};
65
66
// 運行一個新的項目操作,即會執行op中的execute方法
67
try
{
68
getContainer().run(true, true, op);
69
} catch (InterruptedException e)
{
70
return null;
71
} catch (InvocationTargetException e)
{
72
return null;
73
}
74
75
_newProject = newProjectHandle;
76
77
return _newProject;
78
}
79
80
/** *//**
81
* 增加Java的Nature
82
*
83
* @param iprojectdescription
84
*/
85
private void addJavaNature(IProjectDescription iprojectdescription)
{
86
ArrayList arraylist = new ArrayList();
87
arraylist.addAll(Arrays.asList(iprojectdescription.getNatureIds()));
88
arraylist.add("org.eclipse.jdt.core.javanature");
89
iprojectdescription.setNatureIds((String[]) arraylist
90
.toArray(new String[arraylist.size()]));
91
}
92
93
/** *//**
94
* 創建一個新項目
95
*
96
* @param description
97
* @param projectHandle
98
* @param monitor
99
* @throws CoreException
100
* @throws OperationCanceledException
101
*/
102
private void createProject(IProjectDescription description,
103
IProject projectHandle, IProgressMonitor monitor)
104
throws CoreException, OperationCanceledException
{
105
try
{
106
monitor.beginTask("", 2000);
107
108
projectHandle.create(description, new SubProgressMonitor(monitor,
109
1000));
110
111
if (monitor.isCanceled())
112
throw new OperationCanceledException();
113
114
projectHandle.open(IResource.BACKGROUND_REFRESH,
115
new SubProgressMonitor(monitor, 1000));
116
117
} finally
{
118
monitor.done();
119
}
120
}
121
122
/** *//**
123
* 創建輸出文件
124
*
125
* @param ijavaproject
126
* @throws JavaModelException
127
* @throws CoreException
128
*/
129
private void createOutputLocation(IJavaProject ijavaproject)
130
throws JavaModelException, CoreException
{
131
IFolder ifolder = ijavaproject.getProject().getFolder("bin");
132
createFolder(ifolder);
133
IPath ipath = ifolder.getFullPath();
134
ijavaproject.setOutputLocation(ipath, null);
135
}
136
137
/** *//**
138
* 增加Java生成器
139
*
140
* @param ijavaproject
141
* @throws CoreException
142
*/
143
private void addJavaBuilder(IJavaProject ijavaproject) throws CoreException
{
144
IProjectDescription iprojectdescription = ijavaproject.getProject()
145
.getDescription();
146
ICommand icommand = iprojectdescription.newCommand();
147
icommand.setBuilderName("org.eclipse.jdt.core.javabuilder");
148
iprojectdescription.setBuildSpec(new ICommand[]
{ icommand });
149
iprojectdescription
150
.setNatureIds(new String[]
{ "org.eclipse.jdt.core.javanature" });
151
ijavaproject.getProject().setDescription(iprojectdescription, null);
152
}
153
154
/** *//**
155
* 設置Classpath
156
*
157
* @param ijavaproject
158
* @throws JavaModelException
159
* @throws CoreException
160
*/
161
private void setClasspath(IJavaProject ijavaproject)
162
throws JavaModelException, CoreException
{
163
ijavaproject.setRawClasspath(new IClasspathEntry[0], null);
164
addSourceFolders(ijavaproject);
165
addJRELibraries(ijavaproject);
166
addCodeGenLibraries(ijavaproject);
167
}
168
169
/** *//**
170
* 增加JRE庫
171
*
172
* @param ijavaproject
173
* @throws JavaModelException
174
*/
175
private void addJRELibraries(IJavaProject ijavaproject)
176
throws JavaModelException
{
177
ArrayList arraylist = new ArrayList();
178
arraylist.addAll(Arrays.asList(ijavaproject.getRawClasspath()));
179
arraylist.addAll(Arrays.asList(PreferenceConstants
180
.getDefaultJRELibrary()));
181
ijavaproject.setRawClasspath((IClasspathEntry[]) arraylist
182
.toArray(new IClasspathEntry[arraylist.size()]), null);
183
}
184
185
/** *//**
186
* 增加代碼生成中所需要的Jar庫
187
*
188
* @param ijavaproject
189
* @throws JavaModelException
190
*/
191
private void addCodeGenLibraries(IJavaProject ijavaproject)
192
throws JavaModelException
{
193
// TODO:添加代碼生成項目中所需要的Jar包
194
}
195
196
/** *//**
197
* 增加多個源文件目錄
198
*
199
* @param ijavaproject
200
* @throws JavaModelException
201
* @throws CoreException
202
*/
203
private void addSourceFolders(IJavaProject ijavaproject)
204
throws JavaModelException, CoreException
{
205
ArrayList arraylist = new ArrayList();
206
arraylist.addAll(Arrays.asList(ijavaproject.getRawClasspath()));
207
addSourceFolder(ijavaproject, arraylist, "src/java");
208
addSourceFolder(ijavaproject, arraylist, "src/resource");
209
ijavaproject.setRawClasspath((IClasspathEntry[]) arraylist
210
.toArray(new IClasspathEntry[arraylist.size()]), null);
211
}
212
213
/** *//**
214
* 增加源文件目錄
215
*
216
* @param ijavaproject
217
* @param arraylist
218
* @param s
219
* @throws CoreException
220
*/
221
private void addSourceFolder(IJavaProject ijavaproject,
222
ArrayList arraylist, String s) throws CoreException
{
223
IFolder ifolder = ijavaproject.getProject().getFolder(s);
224
createFolder(ifolder);
225
IPackageFragmentRoot ipackagefragmentroot = ijavaproject
226
.getPackageFragmentRoot(ifolder);
227
arraylist.add(JavaCore.newSourceEntry(ipackagefragmentroot.getPath()));
228
}
229
230
/** *//**
231
* 創建一個文件夾
232
*
233
* @param ifolder
234
* @throws CoreException
235
*/
236
private void createFolder(IFolder ifolder) throws CoreException
{
237
IContainer icontainer = ifolder.getParent();
238
if (icontainer != null && !icontainer.exists()
239
&& (icontainer instanceof IFolder))
240
createFolder((IFolder) icontainer);
241
ifolder.create(true, true, null);
242
}
243
244
/** *//**
245
* @see org.eclipse.jface.wizard.Wizard#addPages()
246
*/
247
public void addPages()
{
248
super.addPages();
249
_mainPage = new WizardNewProjectCreationPage("海邁平臺-代碼生成");
250
_mainPage.setTitle("創建一個代碼生成項目框架");
251
_mainPage.setDescription("創建一個代碼生成項目框架");
252
addPage(_mainPage);
253
}
254
255
/** *//**
256
* 更新Eclipse的透視圖
257
*/
258
protected void updatePerspective()
{
259
try
{
260
IWorkbenchPage iworkbenchpage = PlatformUI.getWorkbench()
261
.getActiveWorkbenchWindow().getActivePage();
262
if (iworkbenchpage.findView("org.eclipse.ui.views.PropertySheet") == null)
263
iworkbenchpage.showView("org.eclipse.ui.views.PropertySheet");
264
} catch (PartInitException partinitexception)
{
265
partinitexception.printStackTrace();
266
}
267
}
268
269
/** *//**
270
* @param iresource
271
*/
272
protected void selectAndReveal(IResource iresource)
{
273
selectAndReveal(iresource, _workbench.getActiveWorkbenchWindow());
274
}
275
276
/** *//**
277
* 選擇該項目并顯示出來
278
*
279
* @param iresource
280
* @param iworkbenchwindow
281
*/
282
private void selectAndReveal(IResource iresource,
283
IWorkbenchWindow iworkbenchwindow)
{
284
BasicNewResourceWizard.selectAndReveal(iresource, iworkbenchwindow);
285
}
在創建新項目的時候,要給項目描述類增加一個Java Nature,具體這個Java Nature是什么意思我不太懂
。Eclipse里面很多都采用Adopter模式,所以在WorkspaceModifyOperation中的execute方法是創建項目的核心。其他可以參考代碼。相信不是很難理解。
友情小貼士:
1.在點擊“完成”按鈕后,調用PerformFinish方法。
2.創建一個項目的時候,可以根據page來得到Project句柄,再根據ResourcesPlugin.getWorkspace();來得到工作區,由于每個工作區都含有多個不同插件的描述,可以從工作區創建一個項目描述:workspace .newProjectDescription(newProjectHandle.getName());并設置相應的路徑(可以從Page中得到),并為項目描述增加一些必要的信息,如JavaNature。真正創建項目: projectHandle.create(description, new SubProgressMonitor(monitor,1000), projectHandle.open(IResource.BACKGROUND_REFRESH,new SubProgressMonitor(monitor, 1000));
3.為項目設置Java編譯器,
ICommand icommand = iprojectdescription.newCommand();
icommand.setBuilderName("org.eclipse.jdt.core.javabuilder");
iprojectdescription.setBuildSpec(new ICommand[] { icommand });
4.為項目設置源路徑
ArrayList arraylist = new ArrayList();
arraylist.addAll(Arrays.asList(ijavaproject.getRawClasspath()));
addSourceFolder(ijavaproject, arraylist, "src/java");
addSourceFolder(ijavaproject, arraylist, "src/resource");
ijavaproject.setRawClasspath((IClasspathEntry[]) arraylist.toArray(new IClasspathEntry[arraylist.size()]), null);
5.更新透視圖
1
IWorkbenchPage iworkbenchpage = PlatformUI.getWorkbench()
2
.getActiveWorkbenchWindow().getActivePage();
3
if (iworkbenchpage.findView("org.eclipse.ui.views.PropertySheet") == null)
4
iworkbenchpage.showView("org.eclipse.ui.views.PropertySheet");
6.顯示項目出來
BasicNewResourceWizard.selectAndReveal(iresource, iworkbenchwindow);