使用Eclipse RCP進行桌面程式開發(三):檢視和透檢視
阿新 • • 發佈:2019-02-02
Eclipse RCP開發中,和使用者進行互動最多的介面,應該是檢視了,而透檢視就是將已有的檢視、選單、工具欄、編輯器等等進行組合和佈局。看完這一節,我們就可以建立如下圖這樣的程式介面了。
首先我們來介紹一下檢視,建立一個檢視其實非常簡單,只要從org.eclipse.ui.part.ViewPart繼承一個類,然後在plugin.xml中進行檢視的配置。其中,向檢視中新增控制元件的操作,我們即可以手工編寫,也可以使用Designer外掛,我這裡推薦大家使用Designer外掛,該外掛對RCP提供功能非常強大的支援,如果使用Designer外掛開發檢視,則plugin.xml檔案也不需要我們手動修改了。
比如我們上圖中的第一個檢視,就是從ViewPart繼承一個類,然後在上面加入了幾個swt的控制元件,做得非常得簡單,而它的配置檔案如下:
1<extension
2 point="org.eclipse.ui.views">3 <view
4 class="cn.blogjava.youxia.views.FirstView"5 id="cn.blogjava.youxia.views.FirstView"6 name="第一個View"/>7</extension>
可以看到,實現這個檢視的class為cn.blogjava.youxia.views.FirstView,那麼我們看看FirstView.java吧:
1package cn.blogjava.youxia.views;
2
3import org.eclipse.jface.action.IMenuManager;
4import org.eclipse.jface.action.IToolBarManager;
5import org.eclipse.jface.viewers.TableViewer;
6import org.eclipse.swt.SWT;
7import org.eclipse.swt.widgets.Composite;
8import org.eclipse.swt.widgets.Label;
9import org.eclipse.swt.widgets.Table;
10import org.eclipse.swt.widgets.Text;
11import org.eclipse.ui.part.ViewPart;
12
13publicclass FirstView extends ViewPart {
14
15 private Table table;
16 private Text text_1;
17 private Text text;
18 publicstaticfinal String ID ="cn.blogjava.youxia.views.FirstView"; //$NON-NLS-1$1920 /** *//**21 * Create contents of the view part
22 * @param parent
23 */24 @Override
25 publicvoid createPartControl(Composite parent) {
26 Composite container =new Composite(parent, SWT.NONE);
27
28 final Label label =new Label(container, SWT.NONE);
29 label.setText("姓名:");
30 label.setBounds(56, 41, 36, 12);
31
32 text =new Text(container, SWT.BORDER);
33 text.setBounds(98, 38, 80, 15);
34
35 final Label label_1 =new Label(container, SWT.NONE);
36 label_1.setText("性別:");
37 label_1.setBounds(212, 41, 30, 12);
38
39 text_1 =new Text(container, SWT.BORDER);
40 text_1.setBounds(252, 38, 80, 15);
41
42 final TableViewer tableViewer =new TableViewer(container, SWT.BORDER);
43 //tableViewer.setInput(new Object());44 table = tableViewer.getTable();
45 table.setBounds(56, 75, 374, 143);
46 table.setItemCount(10);
47 table.setLinesVisible(true);
48 //
49 createActions();
50 initializeToolBar();
51 initializeMenu();
52 }53
54 /** *//**55 * Create the actions
56 */57 privatevoid createActions() {
58 // Create the actions59 }60
61 /** *//**62 * Initialize the toolbar
63 */64 privatevoid initializeToolBar() {
65 IToolBarManager toolbarManager = getViewSite().getActionBars()
66 .getToolBarManager();
67 }68
69 /** *//**70 * Initialize the menu
71 */72 privatevoid initializeMenu() {
73 IMenuManager menuManager = getViewSite().getActionBars()
74 .getMenuManager();
75 }76
77 @Override
78 publicvoid setFocus() {
79 // Set the focus80 }81
82 }
2 3import org.eclipse.ui.IPageLayout;
4import org.eclipse.ui.IPerspectiveFactory;
5 6public class Perspective implements IPerspectiveFactory {
7
8 public void createInitialLayout(IPageLayout layout) {
9 String editorArea = layout.getEditorArea();
10 layout.addView("cn.blogjava.youxia.views.FirstView", IPageLayout.RIGHT,0.2f, editorArea);
11 }
12}
2 id="product" 3 point="org.eclipse.core.runtime.products"> 4 <product
5 application="cn.blogjava.youxia.rcp_start.application" 6 name="第一個RCP程式"> 7 <property
8 name="preferenceCustomization" 9 value="plugin_customization.ini"/>10 </product>11</extension>
可見,我們為我們的產品添加了一個prefereneCustomization屬性,該屬性的值為plugin_customization.ini檔案,在該檔案中,我們可以配置我們的樣式。在這裡,它的內容如下:
1org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
2org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
事實上,在這個檔案中可以定義的引數有上百個,大家可以檢視Eclipse的文件。
這個時候,效果應該是這樣的了:
好了,我們現在對以上的程式碼做一個總結。我不是寫教科書,在Blog中也沒有寫得那麼詳細的條件。我們這裡主要關注在哪個地方對程式碼進行擴充套件,可以達到我們想要的效果。比如,我們要建立檢視,就是需要擴充套件org.eclipse.ui.part.ViewPart類,然後向其中新增控制元件,再然後配置plugin.xml檔案,最後修改透檢視的程式碼,以便它能夠顯示出來。
在ViewPart類中,我們新增控制元件的操作主要是在public void createPartControl(Composite parent)這個方法中進行,而方法最後會呼叫以下三個方法:
createActions();
initializeToolBar();
initializeMenu();
從這三個方法的方法名我們不難看出,它們的功能是建立檢視特有的選單欄和工具欄的,結合上一小節的內容,我們應該很快就可以探索到怎麼給檢視新增漂亮的工具欄了,這裡我不再羅嗦。
再來看Perspective.java,不難發現,所有的透檢視類都需要實現IPerspectiveFactory介面,而該介面的createInitialLayout方法,就是描述工作臺視窗中編輯器和檢視的佈局。預設情況下,透檢視中只包含一個編輯器區域,就是我們第一節中看到的那個效果。在createInitialLayou中,我們可以通過以下幾個方法向透檢視中新增檢視、編輯器和選單:
addView —— 新增檢視
addActionSet —— 新增選單和工具欄
createFolder —— 建立一個IForderLayou,可以讓多個檢視重疊在同一個位置
寫到這裡,肯定有人會問,如果我要建立一個象Eclipse中的資源檢視這樣的檢視,該怎麼做呢?這我們就要感謝org.eclipse.jface.viewers包了,Viewer,這裡翻譯為檢視器,它和檢視是不一樣的。JFace檢視器是Jface對SWT部件的封裝,它簡化了我們對小部件的操作。在使用檢視器的時候,它的資料使用單獨的模型物件來儲存,使用檢視器的setInput方法可以為檢視器設定模型,此外,在使用檢視器的時候,需要為它提供ContentProvider(內容提供器)和LabelProvider(標籤提供器)。
JFace檢視器主要分為以下幾類:
1. ListViewer: 對應於SWT的列表控制元件,目的是將列表中的元素對映至SWT列表控制元件
2. TreeViewer: 對應於SWT的樹控制元件,提供樹的展開和摺疊等基本操作
3. TableViewer: 對應於SWT的表控制元件,對映表中的元素
4. TextViewer: 對應於SWT的StyledText控制元件,建立編輯器的時候,使用這個檢視器是最合適不過了。
好了,介紹性的文字就寫到這裡,我想大家一定已經知道了探索的方向。下面,我們看一個簡單的示例,就是這篇文章開頭給出的效果圖。它是我模仿醫院管理系統做的一個簡單例子,左邊的檢視就是使用了一個ListView檢視器。這裡給出它的關鍵程式碼:
1publicvoid createPartControl(Composite parent) {
2
3
4 viewer =new ListViewer(parent, SWT.BORDER);
5 viewer.setContentProvider(new PersonContentProvider());
6 viewer.setLabelProvider(new PersonLabelProvider());
7 viewer.setInput(new PersonModel());
8
9 createActions();
10 initializeToolBar();
11 initializeMenu();
12 }
可以看到,這裡需要設定內容提供器和標籤提供器和模型。下面,我們先建立一個病人類Person.java:
1package cn.blogjava.youxia.views;
2
3publicclass Person {
4
5 private String name;
6 private String sex;
7 public String getName() {
8 return name;
9 }10 publicvoid setName(String name) {
11 this.name = name;
12 }13 public String getSex() {
14 return sex;
15 }16 publicvoid setSex(String sex) {
17 this.sex = sex;
18 }19
20}
下面,建立模型類PersonModel.java,在建構函式中我們向List中填入了幾個初始化資料:
1package cn.blogjava.youxia.views;
2import java.util.ArrayList;
3
4publicclass PersonModel {
5
6 private ArrayList<Person> list =new ArrayList<Person>();
7
8 publicinterface Listener
首先我們來介紹一下檢視,建立一個檢視其實非常簡單,只要從org.eclipse.ui.part.ViewPart繼承一個類,然後在plugin.xml中進行檢視的配置。其中,向檢視中新增控制元件的操作,我們即可以手工編寫,也可以使用Designer外掛,我這裡推薦大家使用Designer外掛,該外掛對RCP提供功能非常強大的支援,如果使用Designer外掛開發檢視,則plugin.xml檔案也不需要我們手動修改了。
比如我們上圖中的第一個檢視,就是從ViewPart繼承一個類,然後在上面加入了幾個swt的控制元件,做得非常得簡單,而它的配置檔案如下:
1<extension
2
4 class="cn.blogjava.youxia.views.FirstView"5 id="cn.blogjava.youxia.views.FirstView"6 name="第一個View"/>7</extension>
可以看到,實現這個檢視的class為cn.blogjava.youxia.views.FirstView,那麼我們看看FirstView.java吧:
1package cn.blogjava.youxia.views;
3import org.eclipse.jface.action.IMenuManager;
4import org.eclipse.jface.action.IToolBarManager;
5import org.eclipse.jface.viewers.TableViewer;
6import org.eclipse.swt.SWT;
7import org.eclipse.swt.widgets.Composite;
8import org.eclipse.swt.widgets.Label;
9import org.eclipse.swt.widgets.Table;
10import
11import org.eclipse.ui.part.ViewPart;
12
13publicclass FirstView extends ViewPart {
14
15 private Table table;
16 private Text text_1;
17 private Text text;
18 publicstaticfinal String ID ="cn.blogjava.youxia.views.FirstView"; //$NON-NLS-1$1920 /** *//**21 * Create contents of the view part
22 * @param parent
23 */24 @Override
25 publicvoid createPartControl(Composite parent) {
26 Composite container =new Composite(parent, SWT.NONE);
27
28 final Label label =new Label(container, SWT.NONE);
29 label.setText("姓名:");
30 label.setBounds(56, 41, 36, 12);
31
32 text =new Text(container, SWT.BORDER);
33 text.setBounds(98, 38, 80, 15);
34
35 final Label label_1 =new Label(container, SWT.NONE);
36 label_1.setText("性別:");
37 label_1.setBounds(212, 41, 30, 12);
38
39 text_1 =new Text(container, SWT.BORDER);
40 text_1.setBounds(252, 38, 80, 15);
41
42 final TableViewer tableViewer =new TableViewer(container, SWT.BORDER);
43 //tableViewer.setInput(new Object());44 table = tableViewer.getTable();
45 table.setBounds(56, 75, 374, 143);
46 table.setItemCount(10);
47 table.setLinesVisible(true);
48 //
49 createActions();
50 initializeToolBar();
51 initializeMenu();
52 }53
54 /** *//**55 * Create the actions
56 */57 privatevoid createActions() {
58 // Create the actions59 }60
61 /** *//**62 * Initialize the toolbar
63 */64 privatevoid initializeToolBar() {
65 IToolBarManager toolbarManager = getViewSite().getActionBars()
66 .getToolBarManager();
67 }68
69 /** *//**70 * Initialize the menu
71 */72 privatevoid initializeMenu() {
73 IMenuManager menuManager = getViewSite().getActionBars()
74 .getMenuManager();
75 }76
77 @Override
78 publicvoid setFocus() {
79 // Set the focus80 }81
82 }
其中,新增控制元件的程式碼由Disgner外掛自動生成。這個時候,如果我們執行程式的話,我們的檢視還不會被顯示出來。為了讓我們的檢視可以顯示,我們還需要修改Perspective.java檔案,程式碼如下:
2 3import org.eclipse.ui.IPageLayout;
4import org.eclipse.ui.IPerspectiveFactory;
5 6public class Perspective implements IPerspectiveFactory {
7
8 public void createInitialLayout(IPageLayout layout) {
9 String editorArea = layout.getEditorArea();
10 layout.addView("cn.blogjava.youxia.views.FirstView", IPageLayout.RIGHT,0.2f, editorArea);
11 }
12}
執行程式,得到如下效果:
我們可以發現,上面這個檢視的標籤不是我們通常看到的波浪形,我們可以通過配置檔案的方式來更改產品的樣式。
首先,在plugin.xml中對org.eclipse.core.runtime.products擴充套件點的屬性進行更改,如下:
2 id="product" 3 point="org.eclipse.core.runtime.products"> 4 <product
5 application="cn.blogjava.youxia.rcp_start.application" 6 name="第一個RCP程式"> 7 <property
8 name="preferenceCustomization" 9 value="plugin_customization.ini"/>10 </product>11</extension>
可見,我們為我們的產品添加了一個prefereneCustomization屬性,該屬性的值為plugin_customization.ini檔案,在該檔案中,我們可以配置我們的樣式。在這裡,它的內容如下:
1org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
2org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
事實上,在這個檔案中可以定義的引數有上百個,大家可以檢視Eclipse的文件。
這個時候,效果應該是這樣的了:
好了,我們現在對以上的程式碼做一個總結。我不是寫教科書,在Blog中也沒有寫得那麼詳細的條件。我們這裡主要關注在哪個地方對程式碼進行擴充套件,可以達到我們想要的效果。比如,我們要建立檢視,就是需要擴充套件org.eclipse.ui.part.ViewPart類,然後向其中新增控制元件,再然後配置plugin.xml檔案,最後修改透檢視的程式碼,以便它能夠顯示出來。
在ViewPart類中,我們新增控制元件的操作主要是在public void createPartControl(Composite parent)這個方法中進行,而方法最後會呼叫以下三個方法:
createActions();
initializeToolBar();
initializeMenu();
從這三個方法的方法名我們不難看出,它們的功能是建立檢視特有的選單欄和工具欄的,結合上一小節的內容,我們應該很快就可以探索到怎麼給檢視新增漂亮的工具欄了,這裡我不再羅嗦。
再來看Perspective.java,不難發現,所有的透檢視類都需要實現IPerspectiveFactory介面,而該介面的createInitialLayout方法,就是描述工作臺視窗中編輯器和檢視的佈局。預設情況下,透檢視中只包含一個編輯器區域,就是我們第一節中看到的那個效果。在createInitialLayou中,我們可以通過以下幾個方法向透檢視中新增檢視、編輯器和選單:
addView —— 新增檢視
addActionSet —— 新增選單和工具欄
createFolder —— 建立一個IForderLayou,可以讓多個檢視重疊在同一個位置
寫到這裡,肯定有人會問,如果我要建立一個象Eclipse中的資源檢視這樣的檢視,該怎麼做呢?這我們就要感謝org.eclipse.jface.viewers包了,Viewer,這裡翻譯為檢視器,它和檢視是不一樣的。JFace檢視器是Jface對SWT部件的封裝,它簡化了我們對小部件的操作。在使用檢視器的時候,它的資料使用單獨的模型物件來儲存,使用檢視器的setInput方法可以為檢視器設定模型,此外,在使用檢視器的時候,需要為它提供ContentProvider(內容提供器)和LabelProvider(標籤提供器)。
JFace檢視器主要分為以下幾類:
1. ListViewer: 對應於SWT的列表控制元件,目的是將列表中的元素對映至SWT列表控制元件
2. TreeViewer: 對應於SWT的樹控制元件,提供樹的展開和摺疊等基本操作
3. TableViewer: 對應於SWT的表控制元件,對映表中的元素
4. TextViewer: 對應於SWT的StyledText控制元件,建立編輯器的時候,使用這個檢視器是最合適不過了。
好了,介紹性的文字就寫到這裡,我想大家一定已經知道了探索的方向。下面,我們看一個簡單的示例,就是這篇文章開頭給出的效果圖。它是我模仿醫院管理系統做的一個簡單例子,左邊的檢視就是使用了一個ListView檢視器。這裡給出它的關鍵程式碼:
1publicvoid createPartControl(Composite parent) {
2
3
4 viewer =new ListViewer(parent, SWT.BORDER);
5 viewer.setContentProvider(new PersonContentProvider());
6 viewer.setLabelProvider(new PersonLabelProvider());
7 viewer.setInput(new PersonModel());
8
9 createActions();
10 initializeToolBar();
11 initializeMenu();
12 }
可以看到,這裡需要設定內容提供器和標籤提供器和模型。下面,我們先建立一個病人類Person.java:
1package cn.blogjava.youxia.views;
2
3publicclass Person {
4
5 private String name;
6 private String sex;
7 public String getName() {
8 return name;
9 }10 publicvoid setName(String name) {
11 this.name = name;
12 }13 public String getSex() {
14 return sex;
15 }16 publicvoid setSex(String sex) {
17 this.sex = sex;
18 }19
20}
下面,建立模型類PersonModel.java,在建構函式中我們向List中填入了幾個初始化資料:
1package cn.blogjava.youxia.views;
2import java.util.ArrayList;
3
4publicclass PersonModel {
5
6 private ArrayList<Person> list =new ArrayList<Person>();
7
8 publicinterface Listener