《Java程序設計案例教程》第10章 圖形用戶界面設計_第1頁
《Java程序設計案例教程》第10章 圖形用戶界面設計_第2頁
《Java程序設計案例教程》第10章 圖形用戶界面設計_第3頁
《Java程序設計案例教程》第10章 圖形用戶界面設計_第4頁
《Java程序設計案例教程》第10章 圖形用戶界面設計_第5頁
已閱讀5頁,還剩28頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

程序設計第10章圖形用戶界面設計目錄2

10.1GUI介紹

10.2

容器

10.3

布局管理

10.4組件

10.5事件處理10.1GUI介紹java.awtJava1.0推出在許多方面有不足javax.swingJava1.1推出在awt的基礎上作了較大改進swing不能替代awtSWTIBM開發的GUI組件,Eclipse是用SWT開發的3AWT舉例一個最簡單的GUI程序基本過程引入需要用到的包(java.awt)定義并創建一個頂層容器(Frame)定義并創建組件(Button、Label)將組件添加到容器中設置窗口大小,并使其可見默認情況下,窗體對關閉事件不作任何響應4importjava.awt.*;publicclassAwtDemo{publicstaticvoidmain(String[]args){Frameframe=newFrame();//聲明和創建一個窗體,FrameButtonbutton=newButton("AnAWTbutton.");//聲明和創建一個按鈕,Buttonframe.add(button);//將button添加到frame上

frame.setSize(200,100);//設置frame的大小

frame.setVisible(true);//設置frame可見

}}Swing舉例一個最簡單的GUI程序基本過程與AWT版本幾乎完全相同引入的包是java.swing頂層容器是JFrame有對應的組件,名稱前加J:JButton、JLabel可以設置窗體對關閉事件的響應

importjavax.swing.*;publicclassSwingDemo{publicstaticvoidmain(String[]args){JFrameframe=newJFrame();//與AWT版本幾乎完全相同

JButtonbutton=newJButton("Aswingbutton.");frame.add(button);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//不同的是增加關閉時的處理

frame.setSize(200,100);frame.setVisible(true);}}frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//不同的是增加關閉時的處理10.2容器容器Container一種特殊的組件,能夠容納其它組件或容器的組件容器分為頂層容器JFrame普通容器JPanel6

importjavax.swing.*;publicclassJPanelDemo{publicstaticvoidmain(String[]args){JFrameframe=newJFrame(“Jpanel應用舉例");//與AWT版本幾乎完全相同JPanelpanel=newJPanel();

JButtonbutton=newJButton(“面板上的按鈕");panel.setBorder(BorderFactory.createTitleBorder(“JPanel的邊界”);panel.add(button);frame.add(panel);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//不同的是增加關閉時的處理

frame.setSize(200,100);frame.setVisible(true);}}組件間的繼承關系7容器組件頂層容器每個JavaGUI應用程序必須至少包含一個頂層容器組件JWindows:比較簡單,一般我們用它的子類JFrameJFrame:一般作為主窗口使用,具有標題、最小化、最大化及并閉按鈕JDialog:對話框,它是依賴于另一個窗口的頂級窗口JApplet:專用于applet中,即applet的顯示區域8普通容器普通容器不能獨立存在,必須依賴于其它容器作為一種中間層容器,普通容器可以容納其它容器或組件在Swing中,這類容器有JPanelJScrollPaneJSplitPaneJTablePaneJToolBar910.3布局管理器布局管理的方式絕對位置和絕對大小相對位置和相對大小采用相對位置和大小會使外觀更加美觀布局管理器每種容器都有一個默認的布局管理器也可以為窗口指定新的布局管理器。常用的布局管理器有FlowLayout,BorderLayou,GridLayout10常見的布局管理器11FlowLayout位置改變,大小不變BorderLayout位置不變,大小改變GridLayout位置不變,大小改變東南西北中三行二列FlowLayout是最簡單的一種布局管理器將組件一個接一個地從左到右,從上到下地依次排列是Panel,JPanel和Applet的默認布局管理器12classFlowLayout_Example{publicstaticvoidmain(String[]args){JFrameframe=newJFrame();frame.setSize(250,100);frame.setLayout(newFlowLayout());frame.add(newJButton("按鈕1"));frame.add(newJButton("按鈕2"));frame.add(newJButton("按鈕3"));frame.add(newJButton("按鈕4"));frame.add(newJButton("按鈕5"));frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}FlowLayout位置改變,大小不變BorderLayout以東南西北中五個位置來定位組件是Window,Dialog和Frame的默認布局管理器13classBorderLayout_Example{publicstaticvoidmain(String[]args){JFrameframe=newJFrame();frame.setSize(250,150);frame.setLayout(newBorderLayout());frame.add(BorderLayout.SOUTH,newJButton("按鈕S"));frame.add(BorderLayout.NORTH,newJButton("按鈕N"));frame.add(BorderLayout.EAST,newJButton("按鈕E"));frame.add(BorderLayout.WEST,newJButton("按鈕W"));frame.add(BorderLayout.CENTER,newJButton("按鈕"));frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}BorderLayout位置不變,大小改變GridLayout是一種將顯示區域分為行和列的布局不是任何容器的默認布局管理器14classGridLayout_Example{publicstaticvoidmain(String[]args){JFrameframe=newJFrame();frame.setSize(250,150);frame.setLayout(newGridLayout(3,2));//3行2列

frame.add(newJButton("按鈕1"));frame.add(newJButton("按鈕2"));frame.add(newJButton("按鈕3"));frame.add(newJButton("按鈕4"));frame.add(newJButton("按鈕5"));frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}GridLayout位置不變,大小改變10.4組件各種按鈕示例publicclassJButtonDemo{ publicstaticvoidmain(String[]args){ JFrameframe=newJFrame("按鈕示例"); frame.setLayout(newFlowLayout()); JButtonbtn1=newJButton("按鈕1"); JButtonbtn2=newJButton(newImageIcon("src/icons/button.gif"));

JButtonbtn3=newJButton("前進",newImageIcon("src/icons/button.gif")); frame.add(btn1); frame.add(btn2); frame.add(btn3); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200,200); frame.setVisible(true); }}15文本框(單行、口令框) JFrameframe=newJFrame("文本框示例"); JPanelpanel=newJPanel(); JTextFieldjtf1=newJTextField();//創建單行文本框 JTextFieldjtf2=newJTextField(15);//創建列數為15的單行文本框 JPasswordFieldjpf=newJPasswordField();//創建密碼框 JLabellabel=newJLabel();

jtf1.setText("這是一個不可編輯的單行文本框"); jtf1.setEditable(false);//設置文本框不可編輯 jpf.setText("這是密碼信息,界面顯示*"); jpf.setEchoChar('*'); char[]pwd=jpf.getPassword(); label.setText(String.valueOf(pwd)); panel.add(jtf1);panel.add(jtf2); panel.add(jpf); panel.add(label); frame.add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200,200); frame.setVisible(true);16文本框(多行)publicstaticvoidmain(String[]args){ JFrameframe=newJFrame(); frame.setLayout(newFlowLayout()); JTextAreajta1=newJTextArea("第一個多行文本框"); jta1.append("&無自動換行");

JTextAreajta2=newJTextArea(5,10); jta2.setLineWrap(true); jta2.setText("第二個多行文本框可以自動換行"); jta2.insert("&",8);

frame.add(jta1); frame.add(jta2); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200,200); frame.setVisible(true); }17復選框、單選按鈕 publicstaticvoidmain(String[]args){ JFrameframe=newJFrame("單選框復選框示例"); JCheckBoxjcb1=newJCheckBox("踢足球"); JCheckBoxjcb2=newJCheckBox("打籃球"); JCheckBoxjcb3=newJCheckBox("打乒乓球"); JCheckBoxjcb4=newJCheckBox("打羽毛球"); JLabellbl=newJLabel("選擇喜愛的運動:");

JLabellbl_xb=newJLabel("性別"); JRadioButtonjrb1=newJRadioButton("男",true); JRadioButtonjrb2=newJRadioButton("女"); ButtonGroupbg=newButtonGroup();//創建分組對象,將jrb1和jrb2放在一組 bg.add(jrb1);bg.add(jrb2);

JPanelpanel=newJPanel(); panel.add(lbl);panel.add(jcb1);panel.add(jcb2); panel.add(jcb3);panel.add(jcb4); panel.add(lbl_xb);panel.add(jrb1);panel.add(jrb2);

frame.add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(420,200); frame.setVisible(true); }18組合框 JFrameframe=newJFrame("列表框組合框示例"); JComboBoxcbo_year=newJComboBox(); JComboBoxcbo_month=newJComboBox(); JComboBoxcbo_day=newJComboBox(); JPanelpanel_cbo=newJPanel();

panel_cbo.setBorder(BorderFactory.createTitledBorder("請選擇年-月-日:")); panel_cbo.add(cbo_year); panel_cbo.add(cbo_month); panel_cbo.add(cbo_day);

inti; for(i=2000;i<=2020;i++) cbo_year.addItem(i); for(i=1;i<=12;i++) cbo_month.addItem(i); for(i=1;i<=31;i++) cbo_day.addItem(i);19列表框 String[]fruit={"蘋果","香蕉","芒果","香梨","柚子"}; JListlist=newJList(fruit); list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); JPanelpanel_list=newJPanel(newGridLayout(1,1)); panel_list.setBorder(BorderFactory.createTitledBorder("請選擇喜愛的水果:")); panel_list.add(list);

frame.setLayout(newBorderLayout()); frame.add(BorderLayout.NORTH,panel_cbo); frame.add(BorderLayout.CENTER,panel_list); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,250); frame.setVisible(true);2010.5事件處理通過事件響應用戶的操作,如鍵盤操作、鼠標操作事件:對用戶操作的描述,如與鍵盤操作對應的是鍵盤事件事件源:發生事件的場所,通常是某個組件,如一個Button事件處理器:接收事件對象并對其進行處理的對象事件處理流程新建一個組件并添加到相應的容器新建一個JButton的實例,并添加到一個JFrame在監聽器中定義處理事件的方法通過繼承WindowAdapter適配器,創建一個監聽器在監聽器中定義windowClosing()方法,處理點擊關閉窗口動作注冊監聽器以監聽組件產生的事件通過addWindowListener()注冊上述監聽器響應用戶用戶點擊關閉窗口時,監聽器將給予響應21監聽器的三種寫法外部類監聽器可以復用內部類封裝性好,可以訪問外部類的屬性和方法匿名類當監聽器的代碼較少,可以提高可讀性22事件處理(外部類)監聽器CloseMe繼承WindowAdapter監聽器是一個外部類23packageorg.ngweb.java.chapt07.event;importjava.awt.*;importjava.awt.event.*;publicclassEventDemo1{publicstaticvoidmain(Stringa[]){Frameframe=newFrame();Buttonbutton=newButton("AnAWTbutton.");frame.add(button);frame.setSize(200,100);frame.addWindowListener(newCloseMe());//注冊監聽器

frame.setVisible(true);}}classCloseMeextendsWindowAdapter{//聲明監聽器

publicvoidwindowClosing(WindowEventevt){//實現/覆蓋監聽器中的方法

System.exit(0);//退出程序

}}事件處理(內部類)監聽器CloseMe同樣繼承WindowAdapter但監聽器是一個內部類,好處是可以直接訪問外部類的屬性和方法24packageorg.ngweb.java.chapt07.event;importjava.awt.*;importjava.awt.event.*;publicclassEventDemo2{publicstaticvoidmain(String[]args){Frameframe=newFrame();Buttonbutton=newButton("AnAWTbutton.");frame.add(button);frame.setSize(200,100);EventDemo2eventDemo2=newEventDemo2();frame.addWindowListener(eventDemo2.newCloseMe());//注冊監聽器,注意new的用法

frame.setVisible(true);}classCloseMeextendsWindowAdapter{//將監聽器聲明為內部類

publicvoidwindowClosing(WindowEventevt){System.exit(0);}}}事件處理(匿名類)監聽器是一個匿名類,沒有類名,同樣需要繼承WindowAdapter注意addWindowListener()參數的寫法25packageorg.ngweb.java.chapt07.event;importjava.awt.*;importjava.awt.event.*;publicclassEventDemo3{publicstaticvoidmain(String[]args){Frameframe=newFrame();Buttonbutton=newButton("AnAWTbutton.");frame.add(button);frame.setSize(200,100);frame.addWindowListener(newWindowAdapter(){//匿名類作為監聽器

publicvoidwindowClosing(WindowEventevt){System.exit(0);}});frame.setVisible(true);}}事件處理模型事件處理的思想用事件封裝用戶的操作隔離事件源和事件處理器用接口來規范事件處理器的動作26發生事件的地方將事件封裝起來傳給監聽器進行處理事件事件封裝了有關的信息,如按了哪個鍵,鼠標點擊的坐標位置等低級事件ComponentEvent組件事件:組件的顯示、隱藏、移動、大小的變化等。ContainerEvent容器事件:容器中增加、移除組件等。FocusEvent焦點事件:焦點的獲得、失去等。KeyEvent鍵盤事件:按鍵的按下、釋放、輸入等。MouseEvent鼠標事件:有二類,一類是鼠標點擊,另一類是鼠標移動拖放等。WindowEvent窗口事件:窗口的打開、關閉、激活、失活、最大化或最小化等。高級事件ActionEvent動作事件:按鈕按下、TextField中按Enter鍵等。AdjustmentEvent調節事件:在滾動條上移動滑塊引起調節數值改變等。ItemEvent項目事件:指示項被選定、取消選定等狀態改變。TextEvent文本事件:文本對象改變等。27監聽器監聽器是接口,它規定了監聽器應該實現的功能。對每一種事件,至少有一個監聽器。共有11種監聽器,其中MouseEvent事件有二種監聽器例如,與鍵盤事件KeyEvent相對應的接口是:應用程序必須編寫監聽器接口的實現并且將監聽器的實現類的實例注冊到相應的組件上28publicinterfaceKeyListenerextendsEventListener{publicvoidkeyPressed(KeyEventev);//按下按鍵

publicvoidkeyReleased(KeyEventev);//釋放按鍵

publicvoidkeyTyped(KeyEventev);//輸入一個鍵值}publicvoidadd<ListenerType>(<ListenerType>listener);適配器適配器是實現了對應監聽器的抽象類,實現的是空實現目的僅僅是為了方便編程,避免代碼冗長鍵盤事件KeyEvent相對應的接口是:對應的適配器抽象類是:29publicinterfaceKeyListenerextendsEventListener{publicvoidkeyPressed(KeyEventev);//按下按鍵

publicvoidkeyReleased(KeyEventev);//釋放按鍵

publicvoidkeyTyped(KeyEventev);//輸入一個鍵值}abstractclassKeyAdapterimplementsKeyListener{publicvoidkeyPressed(KeyEventarg0){//空的實現

}publicvoidkeyReleased(KeyEventarg0){}publicvoidkeyTyped(KeyEventarg0){}}【例10.15】鼠標事件的處理。publicclassMouseEventDemo{ JFrame

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論