




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章SWT圖形用戶界面本章要點1.SWT程序開發步驟。2.SWT常用組件的使用。3.SWT的布局。4.SWT的事件處理。5.SWTDesigner簡介。本章難點1.SWT常用組件的使用。2.SWT的布局。3.SWT的事件處理。4.1SWT/JFace 簡介SWT(StandardWidgetToolkit)即標準小窗口工具箱,是 IBM公司推出的一種在 Eclipse中使用的集成開發環境, SWT提供可移植的 API,并與底層本機 OSGUI平臺緊密集成,它是一個與本地窗口系統集成在一起的小部件集和圖形庫。 SWT由JNI(JavaNativeInterface,Java本機接口)調用操作系統的內部 API,因此運行速度快,能夠獲得與操作系統的內部應用程序相同的外觀。JFace是一個用戶界面工具箱,也是一個易用、功能強大的圖形包,它簡化了常見的圖形用戶界面的編程任務。 SWT和JFace都是Eclipse平臺上的主要組件。 JFace是在SWT的基礎上創建的,但JFace并不能完全覆蓋
SWT
的功能,
JFace和
SWT
的關系如圖
4.1所示。由于
JFace的功能更強大,因此做圖形界面開發時一般優先選用
JFace。圖4.1JFace和SWT的關系程序開發步驟在eclipse的序列號,不同的
plugins目錄下,找到文件,文件名中中eclipse版本這兩個數字也不同。在 DOS
是eclipse的版本號,v3235是SWT狀態下,用jar命令將該文件解壓,命令格
的式如下:jarxf該命令將指定的文件解壓到當前目錄下。解壓后得到四個
DLL
文件:
swt-win32-3235.dll
,swt-awt-win32-3235.dll
,swt-gdip-win32-3235.dll
和
swt-wgl-win32-3235.dll
。這四個文件就是
SWT
的原生庫文件。原生庫文件為 SWT通過JNI訪問windows本地API提供了接口,為使 Java程序在啟動時能夠訪問這些文件,可以通過以下方法進行設置:方法一:將這四個 DLL文件復制到 jre的bin目錄下。方法二:設置環境變量,在 PATH中加入這幾個 dll文件所在的目錄。方法三:在 eclipse的Java項目中導入原生庫文件。操作方法是:在eclipse的包資源管理器中,右單擊項目名→導入→常規→文件系統→下一步→瀏覽→選擇 DLL文件所在目錄 →確定→勾選DLL文件→完成。導入SWT的原生庫文件后,還要在 eclipse的Java項目中配置構建路徑,添加外部 JAR,將文件加入到項目中,操作方法是:在eclipse的包資源管理器中,右單擊項目名 →構建路徑→配置構建路徑 →庫(L)→添加外部JAR→在eclipse的plugins文件夾中找到該 jar文件→打開→確定。例4.1在Java應用程序中使用SWT的組件。操作步驟:新建一個Java項目,項目名為:sample4_1。②采用方法三在項目中導入原生庫文件。③配置構建路徑,將加入到項目中。eclipse包資源管理器可以看到導入的原生庫文件和引入的jar文件,如圖 4.2所示。④在項目中新建一個類,文件名為 HelloSWT.java。⑤在類文件中寫入代碼。圖4.2 包資源管理器 圖4.3 程序運行結果HelloSWT.java
文件內容如下:packageedu.ch4;importimportimportimportimportclass HelloSWT{public static void main(String[]args){Displaydisplay= newDisplay(); //創建一個display 對象。Shellshell= newShell(display); //shell 是程序的主窗體shell.setLayout(null); // 設置shell 的布局方式Texthello= newText(shell,SWT. MULTI); //聲明一個可以顯示多行信息的文本框shell.setText( "Java應用程序"); //設置主窗體的標題shell.setSize(200,100); //設置主窗體的大小Colorcolor= newColor(Display. getCurrent(),255,255,255); //聲明顏色對象shell.setBackground(color); //設置窗體的背景顏色hello.setText( "Hello,SWTWorld!\n\n 你好,SWT世界!");//設置文本框信息hello.pack(); //自動調整文本框的大小//shell.pack();// 自動調整主窗體的大小shell.open(); //打開主窗體while(!shell.isDisposed()){ //如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){ //如果display 不忙display.sleep(); //休眠}}display.dispose();
//銷毀display}}在包資源管理器中,右單擊文件名
HelloSWT.java→運行方式→
Java
應用程序,程序運行結果如圖4.3
所示。該窗體具有典型的 Windows風格。分析本例的源代碼,可以看到,創建一個典型的①創建一個 Display
SWT
應用程序需要以下步驟:②創建一個或多個 Shell③設置Shell的布局④創建Shell中的組件⑤用open()方法打開 Shell窗體⑥寫一個事件轉發循環⑦銷毀display中的包SWT
是
Eclipse圖形
API
的基礎,本節簡單介紹一下
SWT
中常用的包。1.dgetsShell
最常用的組件基本都在此包中,如 Button、Text、Label、Combo等。其中兩個最重要的組件是和Composite。Shell相當于應用程序的主窗體; Composite是容納組件的容器,相當于 SWING中的
Panel對象。2.主要的界面布局方式在此包中。
SWT
對組件的布局也采用了
AWT/SWING
中的
Layout
和
LayoutData
結合的方式。3.對一些基本圖形組件的擴展在此包中,比如其中的
CLabel
就是對標準
Label
組件的擴展,在CLabel
上可以同時加入文字和圖片。在此包中還有一個新的布局方式
StackLayout。4.SWT采用了和 AWT/SWING 一樣的事件模型,在包中可以找到事件監聽類和相應的事件對象。比如,鼠標事件監聽器 MouseListener,MouseMoveListener等,及對應的事件對象 MouseEvent。5.此包中包含針對圖片、光標、字體或繪圖
API。比如,可通過
Image類調用系統中不同類型的圖片文件。6.對不同平臺,
SWT
有一些針對性的
API。例如,在
Windows
平臺,可以通過此包很容易的調用OLE
組件,這使得
SWT
程序也可以內嵌
IE瀏覽器或
Word、Excel
等程序。4.2SWT/JFace 常用組件SWT/JFace常用組件有按鈕(Button類)、標簽(Label類)、文本框(Text類)、下拉框(Combo類)和列表框(List類)等。按鈕組件按鈕(Button)組件是
SWT
中最常用的組件,
Button
類的構造方法是:Button(Compositeparent,intstyle)該方法有兩個參數:第一個參數 parent是指Button創建在哪一個容器上。 Composite(面板)是最常用的容器, Shell(窗體)繼承自 Composite,此參數也能接受 Shell和任何繼承自 Compsite的類。第二個參數 style用來指定 Button的式樣。SWT組件可以在構造方法中使用式樣( style)來聲明組件的外觀形狀和文字的式樣。SWT組件的構造方法和 Button類相似,參數的含義也相同。1.Button組件常用式樣SWT.PUSH:按鈕。SWT.CHECK:多選按鈕。SWT.RADIO:單選按鈕。SWT.ARROW:箭頭按鈕。SWT.NONE:默認按鈕。SWT.CENTER:文字居中,與
SWT.NONE
相同。SWT.LEFT:文字靠左。SWT.RIGHT:文字靠右。SWT.BORDER:深陷型按鈕。SWT.FLAT:平面型按鈕。一個Button也可以指定多個式樣,只要將指定的各個式樣用符號“
|”連接起來即可。如:Buttonbt=newButton(shell,SWT.CHECK|SWT.BORDER|SWT.LEFT);表示創建的按鈕 bt是一個復選按鈕( CHECK),深陷型(BORDER)、文字左對齊( LEFT)。寬度
2.Button組件的常用方法setText(Stringstring):設置組件的標簽文字。setBounds(intx,inty,intwidth,intheight) :設置組件的坐標位置和大?。╳idth,組件高度 height)。
x軸坐標,
y軸坐標,組件setEnabled(Booleanenabled):設置組件是否可用。
true:可用(默認值),false:不可用。setFont(Fontfont):設置文字的字體。setForeground(Colorcolor):設置前景色。setBackgrount(Colorcolor):設置背景色。setImage(Imageimage):設置顯示的圖片。setSelection(Booleanselected):設置是否選中(僅對復選框或單選框有效)
。true:選中,
false:未選中(默認值)。setToolTipText(Stringstring)
:設置鼠標停留在組件上時出現的提示信息。以上方法在其他組件中也可使用。例4.2按鈕示例。按照例4.1的操作步驟建立項目、設置構建路徑和引入原生庫。類
Sample4_2.java
源代碼如下:packageedu.ch4;importimportpublic
class
Sample4_2{public
static
void main(String[]args){Displaydisplay=
newDisplay();
//創建一個
display
對象。Shellshell=newShell(display);//shell是程序的主窗體//shell.setLayout(null);//設置shell的布局方式shell.setText("按鈕示例");//設置主窗體的標題Buttonbt1=newButton(shell,SWT.NULL);//創建默認按鈕bt1.setText("SWT.NULL");//設置按鈕上的文字bt1.setBounds(10,10,75,30);//設置按鈕顯示位置及寬度、高度Buttonbt2=newButton(shell,SWT.PUSH|SWT.BORDER);//創建深陷型按鈕bt2.setText("SWT.PUSH");bt2.setBounds(90,10,75,30);Buttoncheck1=newButton(shell,SWT.CHECK);//創建復選按鈕check1.setText("SWT.CHECK");check1.setBounds(10,50,75,30);Buttoncheck2=newButton(shell,SWT.|SWT.);//創建深陷型復選按鈕CHECKBORDERcheck2.setText("SWT.CHECK");check2.setBounds(90,50,75,30);Buttonradio1=newButton(shell,SWT.);//創建單選按鈕RADIOradio1.setText("SWT.RADIO");radio1.setBounds(10,90,75,30);Buttonradio2=newButton(shell,SWT.RADIO|SWT.BORDER);//創建深陷型單選按鈕radio2.setText("SWT.RADIO");radio2.setBounds(90,90,75,30);ButtonarrowLeft=newButton(shell,SWT.ARROW|SWT.LEFT);//創建箭頭按鈕(向左)arrowLeft.setBounds(10,130,75,20);ButtonarrowRight=newButton(shell,SWT.ARROW|SWT.RIGHT|SWT.BORDER);arrowRight.setBounds(90,130,75,20);shell.pack();//自動調整主窗體的大小shell.open();//打開主窗體while(!shell.isDisposed()){//如果主窗體沒有關閉if(!display.readAndDispatch()){//如果display不忙display.sleep();//休眠}}display.dispose();//銷毀display}}運行結果如圖 4.4所示。圖4.4按鈕 圖4.5標簽標簽組件標簽(Label類)組件是SWT中最簡單的組件。Label類的構造方法和Button類相似,參數的含義與相同,格式如下:Label(Compositeparent,intstyle)Label類的常用式樣有以下幾種:Label類常用的式樣如下:SWT.CENTER:文字居中。SWT.RIGHT:文字靠右。SWT.LEFT:文字靠左。SWT.NONE:默認式樣。SWT.WRAP:自動換行。SWT.BORDER:深陷型。SWT.SEPARATOR:分欄符,默認為豎線分欄。SWT.HORIZONTAL :橫線分欄符。例4.3標簽示例。packageedu.ch4;importimportimportpublicclassSample4_3{publicstaticvoidmain(String[]args){Displaydisplay=newDisplay();//創建一個display對象。Shellshell=newShell(display);//shell是程序的主窗體//shell.setLayout(null);//設置shell的布局方式shell.setText("標簽示例");//設置主窗體的標題Labellb1=newLabel(shell,SWT.|SWT.);//深陷型、文字右對齊BORDERRIGHTlb1.setBounds(10,10,70,30);lb1.setText("標簽1");lb1.setFont(newFont(display,"黑體",14,SWT.BOLD));//設置文字的字體字號lb1.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));Labellb2=newLabel(shell,SWT.);//文字居中的標簽CENTERlb2.setBounds(90,10,70,30);lb2.setText("標簽2");lb2.setFont(newFont(display,"宋體",14,SWT.NORMAL));//設置文字的字體字號Labellb3=newLabel(shell,SWT.SEPARATOR|SWT.BORDER);//豎直分欄符lb3.setBounds(10,50,70,30);Labellb4=newLabel(shell,SWT.SEPARATOR|SWT.HORIZONTAL|SWT.BORDER);//水平分欄符lb4.setBounds(90,50,70,30);shell.pack();//自動調整主窗體的大小shell.open();//打開主窗體while(!shell.isDisposed()){//如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){//如果display不忙display.sleep();//休眠}}display.dispose();//銷毀display}}程序運行結果如圖 4.5所示。文本框組件文本框(Text類)的式樣如下:SWT.NONE:默認式樣。SWT.CENTER:文字居中。SWT.LEFT:文字靠左。SWT.RIGHT:文字靠右。SWT.MULTI:可以輸入多行,須回車換行。SWT.WRAP:可以輸入多行,到行尾后自動換行。SWT.PASSWORD:密碼型,輸入字符顯示成“
*”。SWT.BORDER:深陷型。SWT.V_SCROLL:帶垂直滾動條。SWT.H_SCROLL:帶水平滾動條。例
4.4
各種文本框示例。packageedu.ch4;importimportpublic class Sample4_4{public static void main(String[]args){Displaydisplay= newDisplay(); //創建一個display 對象。Shellshell= newShell(display); //shell 是程序的主窗體shell.setText( "文本框示例 ");Texttext1= newText(shell,SWT. NONE|SWT.BORDER);// 帶邊框text1.setBounds(10,10,70,30);Texttext2= newText(shell,SWT. PASSWORD);text2.setBounds(90,10,70,30);Texttext3= newText(shell,SWT. MULTI|SWT.V_SCROLL|SWT.H_SCROLL);text3.setBounds(10,50,70,70);Texttext4= newText(shell,SWT. WRAP|SWT.V_SCROLL);text4.setBounds(90,50,70,70);shell.pack();shell.open();while(!shell.isDisposed()){ //如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){ //如果display 不忙display.sleep(); //休眠}}display.dispose();
//銷毀display}}運行結果如圖圖4.6
4.6所示。文本框
圖
4.7
下拉框下拉框組件1.下拉框(Combo類)的式樣SWT.NONE:默認式樣。SWT.READ_ONLY:只讀。SWT.SIMPLE:無須單擊下拉框,列表會一直顯示。2.下拉框(Combo類)的常用方法add(Stringstring):在Combo中增加一項。add(Stringstring,intindex):在Combo的第index項后插入一項。deselectAll():使Combo組件中的當前選擇項置空。removeAll()
:將
Combo
中的所有選項清空。setItems(String[]items):將數組中的各項依次加入到 Combo中。select(intindex):將Combo的第index+1項設置為當前選擇項。例
4.5
下拉框示例。packageedu.ch4;importimportimportpublic class Sample4_5{private static Label lb;public static void main(String[]args){Displaydisplay= newDisplay(); //創建一個display 對象。final Shellshell= newShell(display); //shell 是程序的主窗體shell.setText( "下拉框示例 ");final Combocombo=newCombo(shell,SWT. NONE);combo.setBounds(10,10,100,25);lb
=newLabel(shell,SWT.
WRAP);
//
創建標簽,可自動換行lb
.setBounds(120,10,100,35);Buttonbt1=
newButton(shell,SWT.
NONE);bt1.setBounds(20,60,100,25);bt1.setText( "設值");bt1.addSelectionListener( newSelectionAdapter(){public voidwidgetSelected(SelectionEvente){//combo.removeAll(); // 清空combofor(int i=1;i<=3;i++){combo.add("第"+i+"項");// 循環添加選項
按鈕的單擊事件}combo.select(0);
//
設置默認選項}});Buttonbt2= newButton(shell,SWT. NONE);bt2.setBounds(130,60,100,25);bt2.setText( "取值");bt2.addSelectionListener( newSelectionAdapter(){public voidwidgetSelected(SelectionEvente){// 按鈕的單擊事件lb
.setText(
"你選擇的是:
"+combo.getText());}});shell.pack();shell.open();while(!shell.isDisposed()){
//如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){
//如果display
不忙display.sleep();
//休眠}}display.dispose();
//銷毀display}}運行結果如圖4.7所示。本例中,按鈕bt1和bt2添加了按鈕選擇監聽事件代碼。下拉框最初沒有值,單擊【設置】按鈕后將一組數據加入,單擊【取值】按鈕,標簽lb顯示取值的結果。列表框組件列表框(List類)組件的用法和下拉框( Combo類)相似。1.列表框(List類)的式樣SWT.NONE:默認式樣。SWT.V_SCROLL:帶垂直滾動條。SWT.MULTI:允許復選。SWT.SINGLE:允許單選。2.常用方法列表框(List類)組件的方法和下拉框 (Combo類)是一樣的,但由于List可選擇多項,而Combo只能選擇一項,所以 List沒有getText()方法,List的取值是用組成的String數組。例4.6列表框示例。
getSelection()方法,返回一個所有選項packageedu.ch4;importimportimportimportimportimportimportimportpublic class Sample4_6{private static Label lb;public static void main(String[]args){Displaydisplay= newDisplay(); //創建一個display 對象。final Shellshell= newShell(display); //shell 是程序的主窗體shell.setText(
"列表框示例
");final
Listlist=
newList(shell,SWT.
MULTI|SWT.V_SCROLL|SWT.BORDER);聲明一個可復選、帶垂直滾動條、有邊框的列表框。list.setBounds(10,10,100,50);lb
=newLabel(shell,SWT.
WRAP);lb
.setBounds(120,10,90,50);Buttonbt1=
newButton(shell,SWT.
NONE);bt1.setBounds(20,60,100,25);bt1.setText( "設值");bt1.addSelectionListener( newSelectionAdapter(){public voidwidgetSelected(SelectionEvente){list.removeAll();for(int i=1;i<=8;i++){list.add( "第"+i+"項"); // 將選項循環加入到列表框中}list.select(0);}});Buttonbt2= newButton(shell,SWT.bt2.setBounds(130,60,100,25);
NONE);bt2.setText( "取值");bt2.addSelectionListener( newSelectionAdapter(){public voidwidgetSelected(SelectionEvente){String[]selected=list.getSelection();//
聲明字符串數組保存選項StringoutStr= "" ;for(int j=0;j<selected. length;j++){outStr=outStr+ ""+selected[j];//
將數組中的選項加入到輸出字符串}lb.setText( "你選擇的是: "+outStr);}});shell.pack();shell.open();while(!shell.isDisposed()){
//如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){
//如果display
不忙display.sleep();
//休眠}}display.dispose();
//銷毀display}}本例開始運行時,列表框是空的,單擊【設置】按鈕,將選項加入到列表框中,按【
Ctrl
】鍵加鼠標左鍵選項,再按【取值】按鈕。運行結果如圖 4.8所示。圖
4.8
列表框菜單菜單(Menu類,MenuItem類)是常用的SWT組件,Menu是一個菜單欄,同時也是一個容器,可以容納菜單項(MenuItem)。1.Menu的式樣SWT.BAR:菜單欄,用于主菜單。SWT.DROP_DOWN:下拉菜單,用于子菜單。SWT.POP_UP:鼠標右鍵彈出式菜單。2.MenuItem的式樣SWT.CASCADE:有子菜單的菜單項。SWT.CHECK:選中后前面顯示一個小勾。SWT.PUSH:普通型菜單。SWT.RADIO:選中后前面顯示一個圓點。SWT.SEPARATOR:分隔符。3.建立菜單的一般步驟:①首先建立一個菜單欄,需要使用 SWT.BAR屬性。MenumainMenu=newMenu(shell,SWT. BAR);②在窗體中指定需要顯示的菜單欄。shell.setMenuBar(mainMenu);③創建頂級菜單項,需要使用 SWT.CASCADE 屬性。MenuItemfileItem=
newMenuItem(mainMenu,SWT.
CASCADE);fileItem.setText(
"文件
&F");④創建與頂級菜單項相關的下拉式菜單。MenufileMenu= newMenu(shell,SWT.
DROP_DOWN);⑤將頂級菜單項與下拉菜單關聯。fileItem.setMenu(fileMenu);二級菜單的創建只需重復以上步驟 ③~⑤。注意:本例創建所有 Menu對象的第一個參數都是 shell;創建MenuItem對象的第一個參數是該 MenuItem所在的Menu對象;如果某 Menu是某MenuItem的子菜單,則還要建立關聯: MenuItem.setMenu(Menu)。源代碼如下:packageedu.ch4;importimportimportimportimportpublic class Sample4_7{public static void main(String[]args){Displaydisplay= newDisplay(); //創建一個display 對象。final Shellshell= newShell(display); //shell 是程序的主窗體shell.setText( "菜單示例");MenumainMenu=newMenu(shell,SWT. BAR);shell.setMenuBar(mainMenu);//MenumainMenu=newMenu(shell,SWT.POP_UP);// 創建彈出式菜單//shell.setMenu(mainMenu); // 創建彈出式菜單{//"
文件"項MenuItemfileItem=
newMenuItem(mainMenu,SWT.
CASCADE);fileItem.setText(
"文件
&F");//" 文件"菜單MenufileMenu= newMenu(shell,SWT. DROP_DOWN);fileItem.setMenu(fileMenu);{//"
新建"項MenuItemnewFileItem=
newMenuItem(fileMenu,SWT.
CASCADE);newFileItem.setText(
"新建&N");//" 新建"菜單MenunewFileMenu=newMenu(shell,SWT. DROP_DOWN);newFileItem.setMenu(newFileMenu);{//"新建項目"項MenuItemnewProjectItem=
newMenuItem(newFileMenu,SWT.
PUSH);newProjectItem.setText(
"項目
\tCtrl+Shift+N"
);//
設置快捷鍵newProjectItem.setAccelerator(SWT.
CTRL+SWTSHIFT.+'N'
);//
添加事件監聽newProjectItem.addSelectionListener( newSelectionAdapter(){public voidwidgetSelected(SelectionEvente){Texttext= newText(shell,SWT. MULTI|SWT.BORDER|SWT.WRAP);text.setBounds(10,10,100,30);text.setText(
"你選擇了“新建項目”
");}});newMenuItem(newFileMenu,SWT.
SEPARATOR);newMenuItem(newFileMenu,SWT.
PUSH).setText(
"包");newMenuItem(newFileMenu,SWT.
PUSH).setText(
"類");}MenuItemopenFileItem= newMenuItem(fileMenu,SWT. CASCADE);openFileItem.setText( "打開&O");MenuItemexitItem= newMenuItem(fileMenu,SWT. CASCADE);exitItem.setText( "退出&E");}MenuItemhelpItem=helpItem.setText(
newMenuItem(mainMenu,SWT."幫助&H");
CASCADE);}shell.pack();shell.open();while(!shell.isDisposed()){
//如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){
//如果display
不忙display.sleep();
//休眠}}display.dispose();
//銷毀display}}程序運行結果如圖 4.9、4.10所示。當點擊【文件】→【新建】→【項目
Ctrl+Shift+N
】時,文本框中顯示“你選擇了‘新建項目’ ”。圖4.9選擇菜單圖4.10運行結果創建彈出式菜單只需將①、②兩步的代碼改為以下兩行即可。MenumainMenu=newMenu(shell,SWT.POP_UP);//
創建彈出式菜單shell.setMenu(mainMenu); //
創建彈出式菜單4.3容器類通常,組件構建在容器類中,容器構建在主窗體(shell)中,主窗體也是容器,也就是說,容器不僅可以容納組件,也可以容納容器。有了容器,就可以通過它來對組件進行集體操作。例如,容器在界面上移動時,其上的組件也會隨著容器移動,容器隱藏,其組件也會被隱藏,容器銷毀(dispose),其組件也會被銷毀。面板面板(Composite
類)是最常用的容器。主窗體(
shell)是面板(
Composite)的子類。面板的構造方法格式如下:Composite(Compositeparent,intstyle)第一個參數表示該容器創建在哪個容器上,第二個參數表示容器的式樣。 Composite的式樣一般都是用SWT.NONE,這時Composite在界面是不顯示出來的,只是發揮著容器的作用。如果要讓容器形成凹陷效果,可以用SWT.BORDER式樣。例如,在主窗體中創建一個容器:Compositecomposite=newComposite(shell,SWT.NONE);Composite的常用方法:getLayout():得到布局管理器。getLayoutData():得到布局數據。getParent():得到容納該容器的父容器。getShell():得到容納該容器的 Shell。layout():將容器上的組件重新布局,相當于刷新。例4.8面板示例。packageedu.ch4;importimportimportimportimportpublic
class Sample4_8{public
static
void main(String[]args){Displaydisplay= newDisplay(); //創建一個display 對象。final Shellshell= newShell(display); //shell 是程序的主窗體shell.setText( "容器示例");Compositecomposite1= newComposite(shell,SWT. NONE);composite1.setBounds(10,10,100,50);Compositecomposite2= newComposite(shell,SWT. BORDER);composite2.setBounds(120,10,100,50);Labellb1= newLabel(composite1,SWT. NONE);lb1.setText( "面板1");lb1.pack();Labellb2= newLabel(composite2,SWT. NONE);lb2.setText( "面板2");lb2.pack();shell.pack();shell.open();while(!shell.isDisposed()){ //如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){ //如果display 不忙display.sleep(); //休眠}}display.dispose();
//銷毀display}}運行結果如圖 4.11所示。圖4.11面板 圖4.12分組框分組框分組框(Group類)是面板(Composite類)的子類,所以兩者用法基本相同。主要區別是Group顯示有一個方框,且方框線上還可以顯示說明文字。例4.9分組框示例。packageedu.ch4;importimport *;public class Sample4_9{public static void main(String[]args){Displaydisplay= newDisplay(); //創建一個display 對象。final Shellshell= newShell(display); //shell 是程序的主窗體shell.setText( "分組框示例 ");Groupgroup1=newGroup(shell,SWT. NONE); //創建分組框group1.setText( "錄入信息"); // 設置分組框說明信息group1.setBounds(10,20,200,100);Labellb1= newLabel(group1,SWT. NONE);// 在分組框中加入組件lb1.setText( "姓名:");lb1.setBounds(10,20,70,20);Texttext1=newText(group1,SWT.BORDER);text1.setBounds(90,20,70,20);Labellb2=newLabel(group1,SWT.NONE);lb2.setText("地址:");lb2.setBounds(10,50,70,20);Texttext2=newText(group1,SWT.BORDER);text2.setBounds(90,50,70,20);shell.pack();shell.open();while(!shell.isDisposed()){//如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){//如果display不忙display.sleep();//休眠}}display.dispose();//銷毀display}}運行結果如圖 4.12所示。選項卡選項卡包括一個選項卡(TabFolder類)和一個選項頁(TabItem類),TabFolder是容器,可以容納其他容器和組件,但TabItem不是容器,可以把它看成是一個選項標簽,TabFolder通過TabItem來對其中的組件進行控制。每一個TabItem用setControl()方法來控制一個界面組件。例4.10
選項卡示例。packageedu.ch4;importimportpublic class Sample4_10{public static void main(String[]args){Displaydisplay= newDisplay(); //創建一個display 對象。final Shellshell= newShell(display); //shell 是程序的主窗體shell.setText( "選項卡示例 ");TabFoldertabFolder= newTabFolder(shell,SWT. NONE);// 聲明一個選項卡容器tabFolder.setBounds(5,5,180,130);// 設置選項卡的位置和大小TabItemtabItem1= newTabItem(tabFolder,SWT. NONE);// 聲明第1個選項頁tabItem1.setText( "選項1"); // 設置選項頁的標題{創建第1個分組框,建立在tabFolder上Groupgroup1=newGroup(tabFolder,SWT. NONE);group1.setText(
"錄入信息
");
//設置分組框說明信息tabItem1.setControl(group1);
//
讓tabItem1
控制group1Labellb1=
newLabel(group1,SWT.
NONE);
//注意Label
建立在
group1上lb1.setText( "姓名:");lb1.setBounds(10,20,70,20);Texttext1= newText(group1,SWT.text1.setBounds(90,20,70,20);Labellb2= newLabel(group1,SWT.lb2.setText( "地址:");lb2.setBounds(10,50,70,20);Texttext2= newText(group1,SWT.text2.setBounds(90,50,70,20);
BORDER);NONE);BORDER);}TabItemtabItem2=
newTabItem(tabFolder,SWT.
NONE);//
聲明第
2個選項頁tabItem2.setText(
"選項
2");{創建第2個分組框,建立在tabFolder上Groupgroup2=newGroup(tabFolder,SWT. NONE);tabItem2.setControl(group2);
//
讓tabItem2
控制group2group2.setText(
"興趣愛好
");Buttonbt1=
newButton(group2,SWT.
CHECK);bt1.setBounds(20,20,70,20);bt1.setText(
"音樂");Buttonbt2=
newButton(group2,SWT.
CHECK);bt2.setBounds(20,50,70,20);bt2.setText( "美術");Buttonbt3= newButton(group2,SWT. CHECK);bt3.setBounds(20,80,70,20);bt3.setText( "體育");}shell.pack();shell.open();while(!shell.isDisposed()){ //如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){ //如果display 不忙display.sleep(); //休眠}}display.dispose();
//銷毀display}}運行結果如圖 4.13、4.14所示。圖4.13選項1 圖4.14選項24.4布局管理器在Java中, GUI程序開發的目標之一是跨平臺,而每種類型操作系統對屏幕的定義不一樣,所以 Swing中引入了布局的概念,對子組件的位置和大小等信息進行定義。 SWT中也采用了布局方式,用戶可使用布局來控制組件中元素的位置和大小等信息。組件可以用方法 setBounds(intx,inty,intwidth,intheight) 來指定該組件相對于父組件的位置和組件的大小。組件的這種定位方式稱為絕對定位。當組件數量較多,布局較復雜時,則要使用布局管理器LayoutManager來進行定位,這時,每個控件的坐標 X、Y、寬度和高度都是通過 LayoutManager設置的,這種定位方式稱為托管定位。 SWT提供了一些常用的布局管理器供用戶使用;在本章中,將介紹四種基本的布局管理器:FillLayout、RowLayout、GridLayout和FormLayout。在布局管理器中,每當重新設置復合組件的大小,都需要進行定位。布局管理器常常是專為某一個復合組件設計的。一些布局管理器只使用它們自身的參數就可以控制,而另一些布局管理器還需要其它參數(LayoutData),該參數是在設置布局管理器的復合組件中的每個控件上指定的。SWT中常用的布局管理器有如下一些:FillLayout :充滿式布局,在容器中以相同的大小以單行或單列排列組件。RowLayout :行列式布局,以單行或多行的方式定制組件的排列方式。GridLayout:網格式布局,以網格的方式進行布局,組件可以占用指定的一個或幾個網格。FormLayout:表格式布局,通過定義組件四個邊的距離來排列組件,被引用的相對的組件可以是父組件,也可以是同一容器中的其它組件。充滿式布局充滿式布局(FillLayout 類)是最簡單的布局管理器。它把組件按一行或一列充滿整個容器,并強制組件的大小一致。一般,組件的高度與最高組件相同,寬度與最寬組件相同。 FillLayout行,不能設置邊界距離和間距。如果容器中只有一個組件,則該組件會充滿整個容器。
不能折1.構造方法:FillLayout() 創建按一行充滿容器的對象。FillLayout(inttype) 創建按指定類型充滿容器的對象,
指定類型(type)有:SWT.HORIZONTAL按一行充滿容器。SWT.VERTICAL
按一列充滿容器。2.常用屬性:inttype 指定組件充滿容器的類型。要將組件按一列充滿容器,可以設置
type的取值同上。type屬性,代碼如下:FillLayoutfilllayout= newFillLayout();// 創建FillLayoutFilllayout.type=SWT.VERTICAL; // 設置type的值shell.setLayout(filllayout);// 將FillLayout 對象用于shellnewButton(shell,SWT. PUSH).setText( "超寬按鈕1");// 在shellnewButton(shell,SWT. PUSH).setText( "按鈕2");newButton(shell,SWT. PUSH).setText( "按鈕3");newButton(shell,SWT. PUSH).setText( "按鈕4");
對象上中創建按鈕例4.11充滿式布局示例。packageedu.ch4;importimportimportpublic class Sample4_11{public static void main(String[]args){Displaydisplay= newDisplay();
//創建一個
display
對象。finalShellshell=newShell(display);//shell是程序的主窗體shell.setText("FillLayout示例");FillLayoutfilllayout=newFillLayout();//創建FillLayout對象shell.setLayout(filllayout);//將FillLayout對象用于shell上newButton(shell,SWT.PUSH).setText("超寬按鈕1");//在shell中創建按鈕newButton(shell,SWT.).setText("按鈕2");PUSHnewButton(shell,SWT.PUSH).setText("按鈕3");newButton(shell,SWT.).setText("按鈕4");PUSHshell.pack();shell.open();while(!shell.isDisposed()){//如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){//如果display不忙display.sleep();//休眠}}display.dispose();//銷毀display}}運行結果如圖
4.15所示。圖4.15FillLayout水平布局圖4.16FillLayout如果要將按鈕按豎直方向排列,也可以只修改以下一行語句:
垂直布局Layoutlayout=
newFillLayout(SWT.VERTICAL);運行結果如圖
4.16所示。行列式布局行列式布局(RowLayout類)可以使組件折行顯示,可以設置邊界距離和間距。另外,還可以對每個組件通過
setLayoutData()方法設置 RowData對象。RowData用來設置組件的大小。1.構造方法:RowLayout() 創建按行放置組件的對象。RowLayout(inttype) 創建按指定類型放置組件的對象。指定類型(SWT.VERTICAL 按列放置組件。SWT.HORIZONTAL 按行放置組件。
type)有:2.常用屬性:intmarginWidth:組件距容器邊緣的寬度(像素) ,默認值為 0。intmarginHeight:組件距容器邊緣的高度(像素) ,默認值為 0。intmarginTop:組件距容器上邊緣的距離(像素) ,默認值為 3。intmarginBottom:組件距容器下邊緣的距離(像素) ,默認值為 3。intspacing:組件之間的距離,默認值為 3。booleanjustify:如果該屬性為 true,則組件間的距離隨容器的拉伸而變大。默認值為
false。booleanwrap:如果該屬性為動折行。默認值為 true。
true,則當容器空間不足時會自動折行;如果該屬性為
false,不自booleanpack:如果該屬性為相同。默認值為 true。
true,組件大小為設定值;如果該屬性為
false,則強制組件的大小inttype:使組件按指定式樣放置,(type=SWT.HORIZONTAL|SWT.VERTICAL),默認為按行放置,默認值為SWT.HORIZONTAL。3.RowData類:RowData稱為RowLayout的布局數據類,可用于改變容器中組件的外觀形狀。其構造方法:RowData(intwidth,intheight);例如:Buttonbt1=
newButton(shell,SWT.
PUSH);
//創建按鈕bt1.setText(
"按鈕1");RowDatarowdata=newRowData(60,30);//
創建布局數據類的對象bt1.setLayoutData(rowdata);
//
設置按鈕的布局數據利用RowData對象設置按鈕(例4.12行列式布局。
bt1)的寬度是
60像素,高度是
30像素。packageedu.ch4;importimportimportpublicclassSample4_12{publicstaticvoidmain(String[]args){Displaydisplay=newDisplay();//創建一個display對象。finalShellshell=newShell(display);//shell是程序的主窗體shell.setText("FillLayout示例");RowLayoutrowlayout=newRowLayout();//創建按行放置組件的對象rowlayout.pack=false;//強制組件大小相同rowlayout.wrap=false;//不自動折行rowlayout.marginWidth=20;//組件距容器邊緣的寬度為20像素rowlayout.marginHeight=20;//組件距容器邊緣的高度為20像素rowlayout.spacing=10;//組件之間的間距為10像素shell.setLayout(rowlayout);//設置容器shell的布局方式為rowlayoutButtonbt1=newButton(shell,SWT.PUSH);//創建按鈕bt1.setText("按鈕1");RowDatarowdata=newRowData(80,30);//創建布局數據類的對象bt1.setLayoutData(rowdata);//設置按鈕的布局數據newButton(shell,SWT.).setText("按鈕2");PUSHnewButton(shell,SWT.PUSH).setText("按鈕3");newButton(shell,SWT.PUSH).setText("按鈕4");shell.pack();//自動調整容器shell的大小shell.open();//打開主窗體while(!shell.isDisposed()){//如果主窗體沒有關閉則一直循環if(!display.readAndDispatch()){//如果display不忙display.sleep();//休眠}}display.dispose();//銷毀display}}當rowlayout.pack=true時,各按鈕為設定值,如圖 4.17所示;當 rowlayout.pack=false時,各按鈕被強制設定為相同大小,如圖 4.18所示;當 rowlayout.justify=true 時,將主窗體拉伸,各按鈕間的距離也增大,但間隔均勻分布,如圖 4.19所示;當rowlayout.justify=false 時,將主窗體拉伸,各按鈕間距不變,如圖4.20所示;當rowlayout.wrap=false 時,當主窗體寬度收縮, 按鈕自動折行,如圖4.21所示;當 rowlayout.wrap=false時,主窗體寬度收縮,按鈕不會折行,如圖 4.22所示。圖4.17 rowlayout.pack=true圖4.19rowlayout.justify=true
圖
4.18rowlayout.pack=false圖4.20rowlayout.justify=false圖
4.21rowlayout.wrap=true
圖
4.22rowlayout.wrap=false網格式布局網格式布局(GridLayout類)是實用而且功能強大的標準布局,也是較為復雜的一種布局。這種布局把容器分成網格,把組件放置在網格中。 GridLayout有很多可配置的屬性,和
RowLayout
一樣,也有專用的布局數據類 GridData,GridLayout的強大之處在于它可以通過 GridData來設置每一個組件的外觀形狀。 GridLayout 的構造方法無參數,但可以通過 GfidData和設置 GridLayout的屬性來設置組件的排列及組件的形狀和位置。1.GridLayout的屬性intnumColumns:設置容器的列數,組件從左到右按列放置,當組件數大于列數時,下一個組件將自動添加新的一行。默認值為1列。booleanmakeColumnsEqualWidth:強制使列都具有相同的寬度,默認值為marginWidth:設置組件與容器邊緣的水平距離,默認值為5。intmarginHeight:設置組件與容器邊緣的垂直距離,默認值為5。inthorizontalSpacing:設置列與列之間的間隔,默認值為5。intverticalSpacing:設置行與行之間的間隔,默認值為 5。例4.13GridLayout的屬性設置。packageedu.ch4;importimportimportpublic class Sample4_13{public static void main(String[]args){Displaydisplay= newDisplay();Shellshell= newShell(display);shell.setText( "GridLayout 示例");GridLayoutgridLayout= newGridLayout();gridLayout. numColumns=3;gridLayout. horizontalSpacing =30;gridLayout. makeColumnsEqualWidth=true;shell.setLayout(gridLayout);newButton(shell,SWT.PUSH).setText("B1");newButton(shell,SWT.PUSH).setText("超寬按鈕2");newButton(shell,SWT.).setText("按鈕3");PUSHnewButton(shell,SWT.PUSH).setText("B4");newButton(shell,SWT.).setText("按鈕5");PUSHshell.pack();shell.open();while (!shell.isDisposed()){if (!display.readAndDispatch())display.sleep();}display.dispose();}}當gridLayout.numColumns 分別為1、2、3時,按鈕依次按 1列、2列和3列排列,運行結果如圖4.23~4.25所示;當 makeColumnsEqualWidth=true時,雖然按鈕寬度不同,但列寬相同,如圖所示;當 horizontalSpacing=30時,列間距為 30,如圖4.27所示。
4.26圖
4.23numColumns=1
圖
4.24numColumns=2
圖
4.25numColumns=3圖
4.26makeColumnsEqualWidth=true
圖
4.27horizontalSpacing=302.布局數據類( GridData類)GridData 是GridLayout 專用的布局數據類,用 GridDataGridData的構造方法如下:GridData(); 創建一個屬性值為默認值的對象。GridData(inttype); 創建一個指定類型( type)的對象。
可以構建很多復雜的布局方式。①GridData常用類型如下:GridData.FILL通常與GridData類的對象屬性horizontalAlignment和verticalAlignment配合使用,充滿對象屬性指定的空間。GridData.FILL_HORIZONTAL 水平充滿,組件充滿網格水平方向的空間。GridData.FILL_VERTICAL 垂直充滿,組件充滿網格垂直方向的空間。GridData.FILL_BOTH 雙向充滿,組件充滿水平和垂直方向的空間。GridData.HORIZONTAL_ALIGN_BEGINNING 水平對齊靠左,組件在網格中靠左放置。GridData.HORIZONTAL_ALIGN_CENTER 水平對齊居中,組件在網格中居中放置。GridData.HORIZONTAL_ALIGN_END 水平對齊靠右,組件在網格中靠右放置。③GridData常用對象屬性如下:inthorizontalSpan設置組件占用的列數,默認值為1。intverticalSpan設置組件占用的行數,默認值為1。horizontalAlignment設置組件的對齊方式為水平方向。verticalAlignment設置組件的對齊方式為垂直方向。grabExcessHorizontalSpace搶占額外的水平空間。grabExcessVerticalSpace搶占額外的垂直空間。horizontalAlignment和verticalAlignment可以取以下值:BEGINNING開始(水平對齊時居左;垂直對齊時居上)CENTER 居中END 結束(水平對齊時居右;垂直對齊時居下)FILL 充滿默認的horizontalAlignment 值是BEGINNING。默認的 verticalAlignment 值是CENTER。例4.14使用gridData布局。packageedu.ch4;importimportimportpublicclassSample4_14{publicstaticvoidmain(String[]args){Displaydisplay=newDisplay();Shellshell=newShell(display);shell.setText("GridData示例");GridLayoutgridLayout=newGridLayout();//創建網格布局對象gridLayout.numColumns=3;//設置網格布局列數為3gridLayout.makeColumnsEqualWidth=true;//強制列寬相等shell.setLayout(gridLayout);//將shell設置為指定的網格布局式樣GridDatagridData=newGridData();//創建網格布局數據對象gridData.horizontalSpan=2;//水平方向跨2列gridData.verticalSpan=2;//垂直方向跨2行gridData.horizontalAlignment=GridData.;//水平方向居中CENTERgridData.verticalAlignment=GridData.FILL;//垂直方向充滿Buttonb1=newButton(shell,SWT.PUSH);//創建按鈕對象b1b1.setText("B1");b1.setLayoutData(gridData);//將設定的網格布局數據用于按鈕對象b1newButton(shell,SWT.).setText("超寬按鈕2");PUSHnewButton(shell,SWT.PUSH).setText("按鈕3");Buttonb4=newButton(shell,SWT.PUSH);b4.setText("B4");//用帶參數的構造方法創建gridData對象gridData=newGridData(GridData.);FILL_HORIZONTALb4.setLayoutData(gridData);//將gridD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論