京山游俠
專注技術(shù),拒絕扯淡
posts - 50, comments - 868, trackbacks - 0, articles - 0
BlogJava
::
首頁(yè)
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
Eclipse RCP詳解(05):JFace和結(jié)構(gòu)化數(shù)據(jù)
Posted on 2014-03-04 20:56
京山游俠
閱讀(5264)
評(píng)論(6)
編輯
收藏
所屬分類:
擁抱Eclipse RCP
上一篇
Eclipse RCP詳解(04):Eclipse RCP相關(guān)的學(xué)習(xí)資料及國(guó)內(nèi)相關(guān)圖書點(diǎn)評(píng)
前面幾篇都是使用Ubuntu系統(tǒng)及其自帶的Eclipse 3.8.1。在這一篇里,我將為大家展示Fedora 20和其自帶的Eclipse 4.3.1。同時(shí),為了方便我隨時(shí)切換操作系統(tǒng)(Ubuntu、Fedora、Win7),我在GitHub上注冊(cè)了一個(gè)賬號(hào),并把示例代碼放了上去。我切換系統(tǒng)后,只需要Fetch一下,就可以繼續(xù)開(kāi)發(fā)。當(dāng)然,有興趣看我代碼的朋友,也可以clone一份到自己的機(jī)器上。地址:
https://github.com/littleloach/examples.git
關(guān)于Eclipse和Git的整合,請(qǐng)看這里:
淺論Maven和Git的原理及展示其與Eclipse的集成
事實(shí)證明,Eclipse RCP不僅是跨平臺(tái)的,而且是跨版本的。也就是說(shuō),即使我在Fedora中使用了不一樣的Eclipse版本,我在Ubuntu中寫的代碼到Fedora中也不需要修改。(我在Win7中用的Eclipse版本和Ubuntu中的相同。)
Fedora 20和Fedora 19都是我喜歡的版本。因?yàn)樗鼈兊拈_(kāi)發(fā)代號(hào)分別為Heisenberg和薛定諤的貓,不難看出,它們都和量子力學(xué)有關(guān),對(duì)我這樣的理工男吸引力那肯定是巨大的。而Heisenberg更具有傳奇性。不僅因?yàn)樗橇孔恿W(xué)的主要?jiǎng)?chuàng)始人和諾貝爾獎(jiǎng)獲得者,更因?yàn)闅v史上到現(xiàn)在都沒(méi)有定論的海森堡謎題:為什么當(dāng)初他沒(méi)有造出原子彈,是他真的搞錯(cuò)了,還是他故意搞錯(cuò)了?故事是這樣的:第二次世界大戰(zhàn)開(kāi)始后,迫于納粹德國(guó)的威脅,丹麥的大物理學(xué)家玻爾離開(kāi)了心愛(ài)的哥本哈根理論物理研究所,離開(kāi)了朝夕相處的來(lái)自世界各地的同事,遠(yuǎn)赴美國(guó)。德國(guó)的許多科學(xué)家也紛紛背井離鄉(xiāng),堅(jiān)決不與納粹勢(shì)力妥協(xié)。然而,有一位同樣優(yōu)秀的物理學(xué)家卻留下來(lái)了,并被納粹德國(guó)委以重任,負(fù)責(zé)領(lǐng)導(dǎo)研制原子彈的技術(shù)工作,遠(yuǎn)在異鄉(xiāng)的玻爾憤怒了,他與這位過(guò)去的同事產(chǎn)生了尖銳的矛盾,并與他形成了終生未能化解的隔閡。有趣的是,這位一直未能被玻爾諒解的科學(xué)家卻在1970年獲得了“玻爾國(guó)際獎(jiǎng)?wù)?#8221;,而這一獎(jiǎng)?wù)率怯靡员碚?#8220;在原子能和平利用方面做出了巨大貢獻(xiàn)的科學(xué)家或工程師”的。歷史在此開(kāi)了個(gè)巨大的玩笑,這玩笑的主人公就像他發(fā)現(xiàn)的“測(cè)不準(zhǔn)原理”一樣,一直讓人感到困惑和不解。他就是量子力學(xué)的創(chuàng)始人——海森堡。也許他當(dāng)初就是故意留下來(lái)而且故意造不出原子彈的吧。
在正式介紹JFace和結(jié)構(gòu)化數(shù)據(jù)之前,先向大家展示幾張F(tuán)edora的截圖。
第一張,F(xiàn)edora剛安裝完成后,其Gnome桌面是很丑的:
所以需要進(jìn)行一些Art Work,比如多安裝幾個(gè)wallpaper啦,多安裝幾個(gè)theme啦,然后安裝一個(gè)gnome-tweak-tool更改一下字體、字體微調(diào)和抗鋸齒啦。Fedora 19和20還有一個(gè)地方比較令人蛋疼,那就是它提供的gnome-terminal是不支持半透明背景的,如果想要半透明背景,只有自己編譯gnome-terminal。我太懶,所以只好把KDE中的konsole借來(lái)用用了。好在KDE程序在gnome中也可以正常運(yùn)行。下面是經(jīng)過(guò)我折騰后的Fedora 20:
有人說(shuō),GTK+程序的列表兩行之間的寬度大到可以塞進(jìn)一頭大象。以前在Ubuntu下用Eclipse不覺(jué)得,換到Fedora中發(fā)現(xiàn)這個(gè)寬度確實(shí)是挺大的,看著很不舒服。不過(guò)這都不是個(gè)事,換個(gè)GTK+的theme一切都搞定。下面一張是Eclipse的截圖,還是很漂亮的說(shuō):
下面開(kāi)始今天的正題。
結(jié)構(gòu)化數(shù)據(jù)
結(jié)構(gòu)化數(shù)據(jù)可不是我一拍腦袋想出來(lái)的術(shù)語(yǔ)。平時(shí)我們?cè)诮M織和保存數(shù)據(jù)的時(shí)候,離不開(kāi)數(shù)據(jù)結(jié)構(gòu)。我們經(jīng)常使用的數(shù)組、鏈表或多維數(shù)組來(lái)保存數(shù)據(jù),也經(jīng)常使用數(shù)據(jù)庫(kù)的表格保存數(shù)據(jù),但是我們并不是時(shí)時(shí)刻刻想著結(jié)構(gòu)化這么一個(gè)概念。但是在Eclipse中就不一樣了,結(jié)構(gòu)化數(shù)據(jù)是它的一個(gè)很重要的理念,只要有可能,它都會(huì)把數(shù)據(jù)組織成結(jié)構(gòu)化的。比如,如果你在Eclipse中選擇了一些什么,那么這些選擇的東西就是以IStructuredSelection展示出來(lái)的。如下圖,可見(jiàn)Structured無(wú)處不在:
數(shù)組(包括鏈表)、樹(shù)和表格(包括多維數(shù)組)是我們常用的數(shù)據(jù)結(jié)構(gòu)。List控件、Tree控件和Table控件是我們常用的展示數(shù)據(jù)的控件。然而邏輯和形式并不總是一一對(duì)應(yīng)的。比如形式上可以用Tree控件表現(xiàn)的數(shù)據(jù),邏輯上并不一定是用樹(shù)結(jié)構(gòu)組織起來(lái)的數(shù)據(jù)。想想我們做數(shù)據(jù)庫(kù)的ORM映射,如果一個(gè)表中的一行數(shù)據(jù)和另一個(gè)表中的多行數(shù)據(jù)相關(guān)聯(lián)(一對(duì)多映射),寫成Java Entity類的時(shí)候就是一個(gè)Entity中包含有一個(gè)另一個(gè)Entity的List或Set。這兩個(gè)Entity各有各的Class Name,而不是統(tǒng)一叫TreeNode。這兩個(gè)Entity之間也不用getParent和getChildren互相訪問(wèn)。但是從形式上,依然可以用一個(gè)Tree控件來(lái)展示它們,不是嗎?
JFace中的Viewer
在該系列博文的第02篇中,我展示了SWT的List控件和Tree控件。這兩個(gè)控件的使用是很簡(jiǎn)單的,List控件只需要使用add()方法就可以在列表中添加一個(gè)字符串,Tree控件需要先構(gòu)造一個(gè)TreeItem對(duì)象,然后用setText()方法添加一個(gè)字符串。控件只能用來(lái)顯示字符串和字符串前面的一個(gè)小圖標(biāo),不能保存復(fù)雜的數(shù)據(jù)。MVC是常用的設(shè)計(jì)模式,Model用來(lái)保存數(shù)據(jù),而控件只是負(fù)責(zé)顯示,所以中間一定要有一個(gè)機(jī)制將Model中的數(shù)據(jù)轉(zhuǎn)換為能讓控件顯示的字符串和圖標(biāo),并且要能維持?jǐn)?shù)據(jù)在結(jié)構(gòu)化上的邏輯聯(lián)系。
JFace中的Viewer是對(duì)SWT中的控件的封裝,它使用的正是MVC模式。如果不了解Viewer的哲學(xué),使用Viewer就無(wú)從下手。Viewer的哲學(xué)是這樣的:Viewer對(duì)它要顯示的數(shù)據(jù)是怎么組織的沒(méi)有任何要求,可以使用它的setInput()方法將任何一個(gè)對(duì)象作為它的Model;很顯然Viewer不可能智能到顯示任何結(jié)構(gòu)的數(shù)據(jù),所以必須給它提供一個(gè)ContentProvider,ContentProvider就是負(fù)責(zé)將任意類型的Model轉(zhuǎn)化為結(jié)構(gòu)化的數(shù)據(jù);Model經(jīng)過(guò)ContentProvider轉(zhuǎn)化為結(jié)構(gòu)化數(shù)據(jù)后,Viewer再對(duì)該結(jié)構(gòu)中的每一項(xiàng)進(jìn)行顯示,前面提到過(guò)控件只能顯示文字和圖片,所以還需要一個(gè)LabelProvider來(lái)將數(shù)據(jù)轉(zhuǎn)化成要顯示的文字和圖片。
由上面的描述可以看出,要使用Viewer必須最少編寫三樣?xùn)|西:一些Model、一個(gè)ContentProvider和一個(gè)LabelProvider。當(dāng)然,Viewer還有更多的功能,比如對(duì)數(shù)據(jù)進(jìn)行排序和過(guò)濾,只需要提供相應(yīng)的SortProvider和FilterProvider即可,但這兩個(gè)Provider不是必須的。雖然要寫的類比較多,但是JFace都定義好了Interface,我們只需要實(shí)現(xiàn)即可,在IDE的幫助下,這個(gè)工作一點(diǎn)也不難。
一個(gè)簡(jiǎn)單的示例
文字內(nèi)容寫得再多,也不如一個(gè)例子來(lái)得直接。我這里模擬HIS(Hospital Information System)系統(tǒng)中一個(gè)簡(jiǎn)單的功能來(lái)展示Viewer的用法。在醫(yī)院里,一個(gè)住院部(Inpatient Department)可以有很多個(gè)科室(Department),比如內(nèi)科、外科、五官科等,一個(gè)科室里面可以有很多個(gè)病人(Patient)。很顯然,這些數(shù)據(jù)用一個(gè)TreeViewer顯示是再合適不過(guò)了。先看看這個(gè)示例程序界面的總體框架,如下圖:
這只是一個(gè)框架,結(jié)合上面的界面,我簡(jiǎn)要說(shuō)說(shuō)我要實(shí)現(xiàn)的功能:
1、最左邊的視圖使用了一個(gè)TreeViewer,用來(lái)顯示住院部的所有科室和病人;
2、工具欄有兩個(gè)按鈕,如果最左邊的視圖中被選擇的對(duì)象是科室,則帶加號(hào)的按鈕可用,其功能是為該科室增加一個(gè)病人;如果最左邊的視圖中被選擇的對(duì)象是病人,則帶減號(hào)的按鈕可用,其功能是刪除這個(gè)病人;
3、中間的視圖使用一個(gè)TableViewer控件,當(dāng)最左邊的視圖中被選擇的對(duì)象是科室時(shí),則以表格的形式顯示該科室所有病人的詳細(xì)信息,每一行代表一個(gè)病人;
4、最右邊的視圖使用一個(gè)ListViewer控件,僅僅顯示當(dāng)前選擇的內(nèi)容。
為示例程序準(zhǔn)備數(shù)據(jù)
該示例程序用到的數(shù)據(jù)是一個(gè)住院部有多個(gè)科室、一個(gè)科室有多個(gè)病人,很顯然這是一個(gè)典型的一對(duì)多的關(guān)系。所以我們的Model需要三個(gè)類:Inpatient、Department、Patient。其關(guān)系如下:
其中的Gender是一個(gè)枚舉。下面是它們的代碼:
Gender.java
package
com.xkland.examples.rcp.minihis.models;
public
enum
Gender
{
MALE,FEMALE;
}
Inpatient.java
package
com.xkland.examples.rcp.minihis.models;
public
class
Inpatient
{
//
住院部
private
Department[] departments;
public
Department[] getDepartments()
{
return
departments;
}
public
Inpatient()
{
departments
=
new
Department[
4
];
departments[
0
]
=
new
Department(
"
內(nèi)科
"
);
departments[
1
]
=
new
Department(
"
外科
"
);
departments[
2
]
=
new
Department(
"
婦產(chǎn)科
"
);
departments[
3
]
=
new
Department(
"
兒科
"
);
}
}
Department.java
package
com.xkland.examples.rcp.minihis.models;
import
java.util.LinkedList;
import
java.util.List;
public
class
Department
{
private
String name;
private
List
<
Patient
>
patients;
public
Department(String name)
{
super
();
this
.name
=
name;
patients
=
new
LinkedList
<
Patient
>
();
}
public
String getName()
{
return
name;
}
public
void
setName(String name)
{
this
.name
=
name;
}
public
List
<
Patient
>
getPatients()
{
return
patients;
}
public
void
addPatient(Patient patient)
{
patients.add(patient);
}
}
Patient.java
package
com.xkland.examples.rcp.minihis.models;
public
class
Patient
{
//
病人信息,id代表床號(hào)
private
int
id;
private
String name;
private
Gender gender;
private
int
age;
private
Department department;
public
Patient(
int
id, String name, Gender gender,
int
age, Department department)
{
super
();
this
.id
=
id;
this
.name
=
name;
this
.gender
=
gender;
this
.age
=
age;
this
.department
=
department;
}
public
int
getId()
{
return
id;
}
public
void
setId(
int
id)
{
this
.id
=
id;
}
public
String getName()
{
return
name;
}
public
void
setName(String name)
{
this
.name
=
name;
}
public
Gender getGender()
{
return
gender;
}
public
void
setGender(Gender gender)
{
this
.gender
=
gender;
}
public
int
getAge()
{
return
age;
}
public
void
setAge(
int
age)
{
this
.age
=
age;
}
public
Department getDepartment()
{
return
department;
}
public
void
setDepartment(Department department)
{
this
.department
=
department;
}
}
然后,創(chuàng)建一個(gè)PatientView類,在里面使用一個(gè)TreeViewer控件,創(chuàng)建一個(gè)Inpatient類的實(shí)例,然后添加一點(diǎn)點(diǎn)測(cè)試數(shù)據(jù),然后把Inpatient的實(shí)例作為viewer的input即可。如下圖:
當(dāng)然,如果沒(méi)有設(shè)置好ContentProvider和LabelProvider,數(shù)據(jù)是不可能正常顯示的。所以我們還需要?jiǎng)?chuàng)建一個(gè)PatientContentProvider類和PatientLabelProvider類。好在JFace中有早就定義好的接口,我們只需要從這些接口實(shí)現(xiàn)即可,如下圖:
我們先來(lái)看PatientContentProvider需要實(shí)現(xiàn)哪些方法,如下圖,可以看出IDE已經(jīng)自動(dòng)把框架搭建起來(lái)了,我們只需要填空即可(下圖中的空是我已經(jīng)填好了的):
第一個(gè)要實(shí)現(xiàn)的方法是getElements,該方法要求我們把Input的數(shù)據(jù)轉(zhuǎn)化成一個(gè)Object數(shù)組返回。在這個(gè)例子中,Input進(jìn)來(lái)的是Inpatient類的對(duì)象,所以只需要先將inputElement轉(zhuǎn)型為Inpatient,然后返回它里面的Department數(shù)組即可。第二個(gè)要實(shí)現(xiàn)的方法是hasChildren,在本例中,如果element是Department,則它就有children,如果是Patient就沒(méi)有children。最后要實(shí)現(xiàn)的一對(duì)方法就是getChildren和getParent,很顯然,如果element是Department,則它的children是它里面保存的List<Patient>,不過(guò)返回的時(shí)候要把它轉(zhuǎn)化成數(shù)組,如果element是Patient,則它的parent是它的department。So easy!不是嗎?
而PatientLabelProvider的實(shí)現(xiàn)就更簡(jiǎn)單了,如下圖:
看圖填空,我們只需要完成getText方法和getImage方法即可。邏輯也很簡(jiǎn)單,就是判斷element是Department還是Patient,然后分別返回相應(yīng)的字符串和圖片即可。在這里,我還故意把不同的性別顯示為不同的圖標(biāo)。有了截圖,我就不貼代碼了。
俗話說(shuō)一通百通,使用不同的Model和Viewer,就給它不同的ContentProvider和LabelProvider即可。
處理Selection事件
關(guān)于數(shù)據(jù)的展示,我們輕松搞定。不過(guò)這還不算完,還有工作要做。現(xiàn)在數(shù)據(jù)顯示出來(lái)了,我們就可以用鼠標(biāo)來(lái)點(diǎn)擊,來(lái)選擇。那么我們選擇的數(shù)據(jù)怎么樣來(lái)影響我們程序的行為呢?在前面幾篇對(duì)GUI的探討中我說(shuō)過(guò),程序和用戶的交互是通過(guò)事件處理來(lái)進(jìn)行的。也就是說(shuō),當(dāng)我們選擇了Viewer中的一項(xiàng)或多項(xiàng)的時(shí)候,Viewer應(yīng)該發(fā)送一個(gè)Selection事件,我們向程序中注冊(cè)一個(gè)SelectionListener就應(yīng)該可以捕獲到這個(gè)事件。
為了讓patientViewer向程序發(fā)送Selection事件,我們需要讓它成為程序的selectionProvider。通過(guò)在PatientView中添加如下一行代碼(最后一行):
有了發(fā)送Selection事件的源,接著應(yīng)該有接受Selection事件的Listener。先從最簡(jiǎn)單的功能做起。最右邊的視圖只是用來(lái)顯示所選擇的對(duì)象,所以從它先開(kāi)始。最右邊的視圖類是SelectionView,里面用了一個(gè)ListViewer,在這里,我們先讓SelectionView實(shí)現(xiàn)ISelectionListener接口,然后把它注冊(cè)到Workbench中。如下圖,關(guān)鍵代碼我把它標(biāo)出來(lái)了:
selectionChanged()方法將在有目標(biāo)被選中的時(shí)候調(diào)用,該方法的實(shí)現(xiàn)也很簡(jiǎn)單,就是把selection作為L(zhǎng)istViewer的input,讓它顯示即可。而要使用ListViewer,我們又得為它提供一個(gè)ContentProvider和一個(gè)LabelProvider。下面是ContentProvider和LabelProvider的實(shí)現(xiàn),也很簡(jiǎn)單,這次ContentProvider實(shí)現(xiàn)了IStructuredContentProvider接口,而且從代碼中可以看出,selection是一個(gè)IStructuredSelection,哪怕我們只選中一項(xiàng),它也是Structured的。
做好之后,運(yùn)行程序是這樣的效果:
然后再來(lái)實(shí)現(xiàn)中間那個(gè)視圖DepartmentDetailView的功能。在這個(gè)視圖中使用了一個(gè)TableViewer。使用TableViewer比使用ListViewer和TreeViewer要稍微復(fù)雜一點(diǎn),因?yàn)樾枰覀冏约禾砑颖砀竦牧校⒃O(shè)置表格的屬性。和SelectionView一樣,DepartmentDetailView實(shí)現(xiàn)ISelectionListener,并把自己注冊(cè)到Workbench中。代碼如下:
TableViewer依然需要一個(gè)ContentProvider和一個(gè)LabelProvider,不過(guò)沒(méi)有ITableContentProvider,因?yàn)門ableViewer是把每一行當(dāng)成一個(gè)element,所以它只需要和ListViewer一樣的ContentProvider即可。但是TableViewer需要的LabelProvider不一樣,要實(shí)現(xiàn)ITableLabelProvider,在這里,TableViewer才處理不同的列。如下圖:
完成后,運(yùn)行程序是這樣的效果:
根據(jù)用戶的選擇決定工具欄按鈕是否可用
終于進(jìn)入今天的最后一個(gè)議題了。 在前面的幾篇中,我陸續(xù)用過(guò)主菜單、視圖工具欄,今天用到了主工具欄。菜單和工具欄是GUI程序產(chǎn)生命令的主要方式,還有就是快捷鍵和彈出菜單。在Eclipse中,它們的本質(zhì)都一樣,都是通過(guò)關(guān)聯(lián)到一個(gè)command和一個(gè)handler來(lái)實(shí)現(xiàn)其功能,通過(guò)一個(gè)menuContribution來(lái)指定它們的位置。在今天的示例中,我把menuContribution的locationURI設(shè)置為toolbar:org.eclipse.ui.main.toolbar,所以這兩個(gè)按鈕就出現(xiàn)在了主工具欄中。如下圖:
在今天的示例中加入工具欄按鈕可不是為了將工具欄。今天的主題是結(jié)構(gòu)化數(shù)據(jù)。StructuredSelection也是結(jié)構(gòu)化的數(shù)據(jù)。所以在這個(gè)示例中加入工具欄是為了展示用戶選擇的數(shù)據(jù)會(huì)對(duì)工具欄按鈕的行為產(chǎn)生影響。從功能上講,我們希望當(dāng)用戶選擇一個(gè)科室的時(shí)候,添加病人的按鈕可用,而選擇多個(gè)科室或選擇一個(gè)或多個(gè)病人的時(shí)候,添加病人工具欄不可用,希望當(dāng)用戶選擇一個(gè)病人的時(shí)候,刪除病人按鈕可用,而當(dāng)選擇科室或多個(gè)病人的時(shí)候,刪除按鈕不可用。
這樣的需求在GUI編程中可以算是無(wú)處不在。Eclipse RCP是如何處理這個(gè)問(wèn)題的呢?答案就是Workbench Core Expressions。下圖是Eclipse幫助文檔中關(guān)于Workbench Core Expressions的頁(yè)面:
然后,我們只需要對(duì)工具欄的按鈕添加如下的Workbench Core Expressions即可:
收工,今天就寫到這里。這篇文章已經(jīng)夠長(zhǎng)了,截圖也有20多張了,所以實(shí)現(xiàn)那兩個(gè)按鈕的Handler我就不寫了。理解了結(jié)構(gòu)化數(shù)據(jù)和理解了IStructuredSelection后,理解Workbench Core Expression就很容易了,更詳細(xì)的內(nèi)容大家自己看幫助文檔吧。
寫到這里,Eclipse RCP的大部分UI元素如窗口、菜單、工具欄、視圖等等什么的都提到了,還有一個(gè)很重要的大件的UI building block就是編輯器了。等下次有時(shí)間,我再來(lái)詳細(xì)討論編輯器的編寫。
評(píng)論
#
re: Eclipse RCP詳解(05):JFace和結(jié)構(gòu)化數(shù)據(jù)
回復(fù)
更多評(píng)論
2014-04-19 10:01 by
bimbashi
期待博主更新,另外能否說(shuō)一下windowbuilder,jfreechart等在RCP里面怎么用,他們與e4 tools的關(guān)系等。
#
re: Eclipse RCP詳解(05):JFace和結(jié)構(gòu)化數(shù)據(jù)
回復(fù)
更多評(píng)論
2014-12-21 01:32 by
當(dāng)當(dāng)爸
看到博主在博客園的Linux系列了,想留言需要注冊(cè)就作罷,希望博主繼續(xù)Eclipse RCP系列啊
#
re: Eclipse RCP詳解(05):JFace和結(jié)構(gòu)化數(shù)據(jù)
回復(fù)
更多評(píng)論
2014-12-21 20:00 by
當(dāng)當(dāng)爸
設(shè)置visibleWhen后,RCP啟動(dòng)后工具欄顯示不出來(lái),是否應(yīng)該在handler處設(shè)置enableWhen,我這樣設(shè)置后可以
#
re: Eclipse RCP詳解(05):JFace和結(jié)構(gòu)化數(shù)據(jù)
回復(fù)
更多評(píng)論
2014-12-21 20:16 by
當(dāng)當(dāng)爸
另外,想問(wèn)一下博主,你的圖片都是自己畫的嗎?用什么工具畫的?
#
re: Eclipse RCP詳解(05):JFace和結(jié)構(gòu)化數(shù)據(jù)[未登錄](méi)
回復(fù)
更多評(píng)論
2014-12-22 21:35 by
京山游俠
@當(dāng)當(dāng)爸
是要繼續(xù)Eclipse RCP系列的,中途因?yàn)闇?zhǔn)備碩士論文和參加答辯,然后從5月份又開(kāi)始寫Linux系列所以就停了。
至于畫圖,我用的Dia。在我的Linux系列中,有一篇就是專門介紹繪圖軟件的。
#
re: Eclipse RCP詳解(05):JFace和結(jié)構(gòu)化數(shù)據(jù)
回復(fù)
更多評(píng)論
2015-01-09 09:13 by
家電維修
博主的幾篇Eclipse RCP系列文章都很精彩,繼續(xù)支持博主。
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
Eclipse RCP詳解(05):JFace和結(jié)構(gòu)化數(shù)據(jù)
Eclipse RCP詳解(04):Eclipse RCP相關(guān)的學(xué)習(xí)資料及國(guó)內(nèi)相關(guān)圖書點(diǎn)評(píng)
Eclipse RCP詳解(03):SWT的相關(guān)概念以及一個(gè)連連看游戲的實(shí)現(xiàn)
Eclipse RCP詳解(02):Eclipse的Runtime和UI初探
Eclipse RCP詳解(01):Hello World以及Eclipse RCP和OSGi的簡(jiǎn)單展示
使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(六):向OpenGL進(jìn)軍
使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(五):2D繪圖
使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(四):在Windows中使用Active X控件
使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(三):視圖和透視圖
使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(二):菜單、工具欄和對(duì)話框
Powered by:
BlogJava
Copyright © 京山游俠
日歷
<
2014年3月
>
日
一
二
三
四
五
六
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
留言簿
(72)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
J2EE學(xué)習(xí)及探索(3)
Linux和Java(4)
NetBeans與J2ME(5)
SpringSide開(kāi)發(fā)實(shí)戰(zhàn)(24)
SVN與源代碼管理(3)
擁抱Eclipse RCP(11)
隨筆檔案
2014年3月 (1)
2014年2月 (2)
2014年1月 (2)
2013年12月 (1)
2009年8月 (1)
2009年7月 (6)
2009年4月 (3)
2009年3月 (1)
2008年12月 (4)
2008年11月 (1)
2008年3月 (1)
2008年2月 (2)
2008年1月 (1)
2007年12月 (1)
2007年10月 (3)
2007年8月 (3)
2007年7月 (2)
2007年3月 (3)
2007年1月 (2)
2006年12月 (5)
2006年11月 (4)
2006年9月 (1)
收藏夾
我常用的技術(shù)資料(7)
我的博客系列
我的 .net 博客
我的 c++ 博客
搜索
積分與排名
積分 - 657495
排名 - 73
最新評(píng)論
1.?re: SpringSide 3 中的安全框架
通俗易懂,謝謝樓主
--薄荷檸檬草
2.?re: 淺論Maven和Git的原理及展示其與Eclipse的集成
就是單純的表示下 感謝! 入門階段看了很多介紹 從你這里收貨最大!多謝!
--laowang
3.?re: 使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(六):向OpenGL進(jìn)軍[未登錄](méi)
10年過(guò)去了。。
--pass86
4.?re: SpringSide 3 中的安全框架
樓主的文章果然講的好清晰,謝謝分享
--匿
5.?re: 淺論Maven和Git的原理及展示其與Eclipse的集成
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--zuidaima
閱讀排行榜
1.?使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(一):快速起步(69804)
2.?SpringSide 3 中的安全框架(65744)
3.?使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(二):菜單、工具欄和對(duì)話框(36552)
4.?使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(三):視圖和透視圖(33512)
5.?SpringSide開(kāi)發(fā)實(shí)戰(zhàn)(一):使用Eclipse讓SpringSide跑起來(lái)(31500)
評(píng)論排行榜
1.?使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(一):快速起步(54)
2.?SpringSide開(kāi)發(fā)實(shí)戰(zhàn)(七):在項(xiàng)目中整合FCKeditor(42)
3.?使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(三):視圖和透視圖(40)
4.?SpringSide 3 的進(jìn)步(33)
5.?使用Eclipse RCP進(jìn)行桌面程序開(kāi)發(fā)(二):菜單、工具欄和對(duì)話框(30)
主站蜘蛛池模板:
日本免费人成黄页在线观看视频
|
免费的黄网站男人的天堂
|
亚洲精品成人网站在线播放
|
国产精品久久久亚洲
|
黑人大战亚洲人精品一区
|
国产偷国产偷亚洲清高动态图
|
亚洲伊人久久成综合人影院
|
国产精品亚洲产品一区二区三区
|
天堂亚洲免费视频
|
在线看亚洲十八禁网站
|
鲁啊鲁在线视频免费播放
|
免费无毒a网站在线观看
|
一个人看的www在线免费视频
|
一二三四在线观看免费中文在线观看
|
人成电影网在线观看免费
|
一个人免费观看日本www视频
|
国产高清视频免费在线观看
|
99精品免费视品
|
免费无码VA一区二区三区
|
91高清免费国产自产
|
成人免费无码大片A毛片抽搐色欲
|
女人18毛片免费观看
|
亚洲国产精品成人
|
亚洲线精品一区二区三区影音先锋
|
免费人成在线观看播放a
|
一级特级女人18毛片免费视频
|
亚洲jjzzjjzz在线观看
|
亚洲精品免费网站
|
色屁屁www影院免费观看视频
|
国产免费高清69式视频在线观看
|
久久99免费视频
|
无码区日韩特区永久免费系列
|
成在人线AV无码免费
|
亚洲国产成人久久综合野外
|
亚洲国产精品无码久久一线
|
亚洲永久中文字幕在线
|
亚洲JIZZJIZZ妇女
|
中文字幕无线码免费人妻
|
7x7x7x免费在线观看
|
日韩精品免费电影
|
综合亚洲伊人午夜网
|