Java語言程序設計:ch08 Swing圖形用戶界面程序設計_第1頁
Java語言程序設計:ch08 Swing圖形用戶界面程序設計_第2頁
Java語言程序設計:ch08 Swing圖形用戶界面程序設計_第3頁
Java語言程序設計:ch08 Swing圖形用戶界面程序設計_第4頁
Java語言程序設計:ch08 Swing圖形用戶界面程序設計_第5頁
已閱讀5頁,還剩59頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

Java語言程序設計第8章Swing圖形用戶界面程序設計2013.112023/1/112本章總體綱要簡介組件和容器布局管理器事件處理模型(難點)高級GUI菜單表格MDIGUI簡介用戶界面是用戶與計算機系統進行交互的接口,圖形用戶界面(GUI)是一種以圖形方式進行人機交互的界面。Java實現了一組用于GUI設計的標準組件的類:目前建議使用SwingSwing的類層次結構java.awt.Component

|——java.awt.Container

——java.awt.Window

——java.awt.Frame—javax.swing.JFrame

——javax.Dialog—javax.swing.JDialog

——javax.swing.JWindow

——java.awt.Applet-javax.swing.JApplet

——javax.swing.Box

——javax.swing.JComponet組件類的層次結構java.lang.Object|+--java.awt.Component|+--java.awt.Container|+--javax.swing.JComponentJComponent——大多數Swing組件類父類3種頂層容器JFrameJDialogJAppletSwing程序結構簡介Swing的程序設計一般可按照下列流程進行:

1.引入Swing包(Importjavax.swing.*;)

2.選擇“外觀和感覺”(

FlowLayout BorderLayout、GridLayout、CardLayout、

GridBagLayout、

BoxLayout、

setLayout)

3.設置頂層容器(JFrame,JApplet,JDialog和Jwindow)

4.設置組件

JLabel、JTextField、Jbutton、JCheckBox、JComboBox、JTextArea

5.向容器中添加組件(

pane.add(button);)

6.在組件周圍添加邊界(setBorder)

7.進行事件處理publicvoidactionPerformed(ActionEvente){}6本章總體綱要簡介組件和容器布局管理器事件處理模型高級GUI菜單表格MDI組件和容器在javax.swing包中,有兩種類型的組件:容器和組件。容器(container)各種組件必須放在容器,容器本身也是一種組件頂層容器,如JFrame,JApplet,JDialog和JWindow其它容器,如JPanel,JScrollPane,JSplitPane,JToolBar

組件(component)基本控制組件,如JButton,JComboBox,JList,JMenu,JSlider,JTextField不可編輯的信息顯示組件,如JLabel,JProgressBar,JToolTip可編輯的信息顯示組件,如JColorChooser,JFileChooser,JTable,JTextArea一些GUI容器與組件頂層容器框架(JFrame)對話框(JDialog)小應用程序(Applet與JApplet)中間容器:面板(JPanel)其它容器JScrollPaneJSplitPane常用組件標簽(JLabel)文本框(JTextField)按鈕(JButton)復選框(JCheckBox)組合框(JComboBox)文本(JTextArea)頂層容器——框架(JFrame)一個簡單的例子:importjava.awt.*;importjava.swing.*;publicclassMyFrameextendsJFrame{publicstaticvoidmain(Stringargs[]){

MyFramefr=newMyFrame(“HelloOutThere!”); fr.setSize(500,500); fr.setBackground(color.green); fr.setVisible(true); }publicMyFrame(Stringstr){ super(str); }}HelloOutThere!框架(JFrame)閱讀教材P245例程理解:對JFrame添加組件有兩種方式:1)用getContentPane()方法獲得JFrame的內容面板,再對其加入組件:

Containerc=frame.getContentPane()c.add(childComponent)2)建立一個JPanel或JDesktopPane之類的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內容面板:JPanelcontentPane=newJPanel();

……//把其它組件添加到Jpanel中;

frame.setContentPane(contentPane);

//把contentPane對象設置成為frame的內容面板Java程序設計201311基于Swing實現的框架界面Importjava.awt.*;Importjavax.swing.*;publicclassJFrameDemo{ JFramef; JButtonb; Containerc; publicJFrameDemo(){ f=newJFrame("JFrameDemo");//頂層容器 b=newJButton(“Pressme”);//基本控制組件

c=f.getContentPane();//用getContentPane()方法獲得JFrame的內容面板 c.add(b); f.setSize(200,200); f.setVisible(true); } publicstaticvoidmain(Stringargs[]){ newJFrameDemo(); }}頂層容器——JDialog(對話框)JDialog與JFrame類似,是有邊框、有標題、可獨立存在的頂級容器。對話框分為無模態對話框和模態對話框。模態對話框只讓程序響應對話框內部的事件,對于對話框以外的事件程序不響應;而無模態對話框可以讓程序響應對話框以外的事件。JDialog的主要構造方法有:JDialog()JDialog(Frame

owner)JDialog(Frame

owner,boolean

modal)JDialog(Frame

owner,String

title)JDialog(Frame

owner,String

title,boolean

modal)

其中,參數owner指明對話框所依賴的窗口,title指明對話框的標題,modal指明對話框是否為模態。

閱讀例程:教材P249JOptionPane閱讀例程:教材P251中間容器——面板(JPanel)JPanel組件是一個中間容器,是一塊無邊框的區域,必須放在Window或Frame中,用于將小型的輕量級組件組合在一起。JPanel的默認布局為FlowLayout。…fr=newJFrame(“FramewithPanel”);JPanelpan=newJPanel();fr.setSize(200,200);fr.setBackground(Color.blue);pan.setSize(100,100);pan.setBackground(Color.yellow);fr.add(pan);fr.setVisible(true);…}FramewithPanel容器——滾動窗口JScrollPane類JScrollPane類帶有滾動條,并且只能向滾動窗口添加一個組件。要將多個組件放在同一個滾動窗口里,可以先將其添加到一個Panel對象里,再將該Panel對象添加到滾動窗口里。JScrollPane類構造方法:JScrollPane()JScrollPane(inta)參數a:指定滾動條的初始狀態,ALWAYS、NEEDED、NEVER。JScrollPane(Componentview)參數view指定需要加上滾動條功能的組件閱讀例程:教材P259容器——JSplitPane(分隔板)JSplitPane提供可拆分窗口,支持水平拆分(JSplitPane.HORIZONTAL_SPLIT)和垂直(JSplitPane.VERTICAL_SPLIT)拆分并帶有滑動條。常用方法有:JSplitPane

(int

newOrientation,Component

newLeftComponent,Component

newRightComponent)

創建一個具有指定方向和指定組件的新JSplitPane。addImpl(Componentcomp,Objectconstraints,intindex)

//增加指定的組件setTopComponent(Componentcomp)//設置頂部的組件setDividerSize(intnewSize)//設置拆分的大小setUI(SplitPaneUIui)//設置外觀和感覺Java程序設計201317分隔板(JSplitPane)效果圖2023/1/1118本章總體綱要基本GUI組件布局管理器事件處理模型高級GUI菜單表格MDIJava程序設計2013LayoutManager容器中組件的布局通常由LayoutManager控制。

LayoutManager負責決定容器的布局策略及容器內

每個組件的大小。每個容器都由一個缺省的LayoutManager,可通過

setLayout()方法改變。

Java提供的布局管理器

FlowLayout

BorderLayout

GridLayout

CardLayout

GridBagLayout

BoxLayout(*,swing)

LayoutManagerSwing

GUI程序設計布局管理一般思路:先通過頂層容器(如JFrame)的方法getContentPane獲取頂層容器的內容窗格;再通過類java.awt.Container的方法setLayout設置內容窗格的布局管理器。如例程:教材P266閱讀教材例程自學該節內容Java程序設計201321使用布局管理器的基本規則(1)若組件盡量充滿容器空間,可以考慮使用BorderLayout、BoxLayout或GridBagLayout。(2)若用戶需要在緊湊的一行中以組件的自然尺寸顯示較少的組件,用戶可以考慮用面板容納組件,并使用面板的默認布局管理器FlowLayout。(3)若用戶需要在多行或多列中顯示一些同樣尺寸的組件,GridLayout最適合此情況。(4)若界面較為復雜,可先使用面板來容納組件,然后選用適當的布局管理器。Java程序設計201322布局管理器嵌套實際上是容器的嵌套,被嵌套的容器可以具有不同的布局管理器;在嵌套的布局管理器中,JPanel通常起到了“橋”的作用.例子:實現GUI的步驟分析panel1panel2panel3panel5panel4panel6panel8panel7有興趣的同學可以用代碼實現2023/1/1124本章總體綱要基本GUI組件布局管理器事件處理模型高級GUI菜單表格MDI事件處理模型GUI是由事件(event)驅動的當用戶與GUI交互可以產生事件(events)一些常見的交互方式移動鼠標用鼠標點擊按鈕在文本框中輸入數據關閉窗口等事件處理模型是Java語言提供的一種人機交互模型,它使得用戶能夠通過鼠標、鍵盤或其他輸入設備來控制程序的執行流程。事件處理機制事件監聽器A事件監聽器B事件對象事件對象主要涉及三種對象事件源能夠產生事件的對象都可以成為事件源,如文本框、按鈕、鍵盤、鼠標等事件對象(Aneventobject)事件對象記錄了事件源以及處理該事件所需要的各種信息事件信息被包含在類AWTEvent或其子類的實例對象中事件對象所對應的類以Event結尾命名基本事件對象所對應的類位于包java.awt.event中高級事件對象所對應的類位于包javax.swing.event.接受事件對象,并處理事件對象事件分類

java.util.EventObjectJava.awt.AWTEventActionEventAdjustmentEventComponentEventItemEventTextEvent…ContainerEventFocusEventWindowEventPaintEventInputEventMouseEventKeyEvent教材P284表8.3列出了一些常見事件類監聽器接口對于每種類型的事件,都定義了相應的事件處理接口;XXXEvent對應的事件處理接口通常為XXXListener。

java.util.EventListenerActionListenerItemListenerWindowListenerKeyListenerMouseListenerMouseMotionListener…教材P284表8.4列出了一些常見事件監聽器接口和事件適配器類Java程序設計201329事件接口及處理方法事件描述信息接口名稱方法(事件)點擊按鈕、點擊菜單項、文本框按回車等動作ActionListeneractionPerformed(ActionEvent)選擇了可選項的項目,如復選框、單選按鈕、下拉選項框ItemListeneritemStateChanged(ItemEvent)文本組件內容改變TextListenertextValueChanged(TextEvent)移動了滾動條等組件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠標移動MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠標點擊等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)Java程序設計2013事件接口及處理方法(續)描述信息接口名稱方法(事件)鍵盤輸入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)組件收到或失去焦點FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)組件移動、縮放、顯示/隱藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)實例按鈕事件方法1:常規方法方法2:采用另一個類中實現事件接口的方法方法3:采用匿名內部類實現事件接口的方法程序見文檔“chap8_samples.doc”通過實例理解:事件源、事件對象、事件監聽器實例:如何監聽多個組件事件?例:編寫一個在文本字段中輸入一個數的程序。創建一個每當用戶單擊一次就將此數加一的按鈕。創建另一個每當用戶單擊一次就將此數減一的按鈕。界面效果如下圖所示。程序見文檔“chap8_samples.doc”33選項事件ItemEvent的處理可觸發選項事件的組件有:

JCheckBox,JRadioButton,JComboBox注冊事件的方法:publicvoidaddItemListener(ItemListenere)處理事件的接口ItemListener,僅含有方法:publicvoiditemStateChanged(ItemEvente)實例:用JComboBox和JCheckBox來演示可選項目事件接口,界面如下圖所示:鼠標事件處理鼠標事件能夠被GUI組件捕獲到基本事件監聽器的接口MouseListenerMouseMotionListenerMouseWheelListenerMouseInputListener是包javax.swing.event的接口包含了MouseListener和MouseMotionListener的所有成員方法鼠標事件對應的類是MouseEvent,其中定義了以下一些常量和方法:MOUSE_PRESSED

鼠標按下MOUSE_CLICKED

鼠標單擊MOUSE_RELEASED鼠標松開MOUSE_ENTERED

鼠標進入有鼠標事件監聽的容器MOUSE_EXITED

鼠標離開有鼠標事件監聽的容器getX()取得鼠標的X坐標getY()取得鼠標的Y坐標getClickCount()取得鼠標連續單擊的次數這三個接口是包java.awt.event的接口Java程序設計2013MouseListener接口MouseListenermouseClicked(MouseEvente)mouseEntered(MouseEvente)mouseExited(MouseEvente)mousePressed(MouseEvente)mouseReleased(MouseEvente)MouseListener接口實例程序見文檔“chap8_samples.doc”Java程序設計2013MouseMotionListener接口通過該接口掌握鼠標的坐標,并處理拖曳鼠標的操作

MouseMotionListenermouseDragged(MouseEvente)mouseMoved(MouseEvente)MouseMotionListener接口實例程序見文檔“chap8_samples.doc”Java程序設計2013事件適配器事件適配器類(Adapter)只實現接口所需要處理的方法通過覆蓋對于接口中的其它方法:系統會提供默認的方法(方法體為空)事件適配器類與事件監聽器接口的區別?利用事件適配器類,只需實現所需處理的方法利用事件監聽器接口,必須實現所有的方法事件適配器類與事件監聽器接口的執行效率?利用事件適配器類處理事件,并不能提高執行效率事件偵聽器接口、適配器類與方法目錄ListenerInterfaceAdapterClassMethodsActionListener

無actionPerformedAdjustmentListener

無adjustmentValueChangedComponentListener

ComponentAdapter

componentHidden

componentMoved

componentResized

componentShownContainerListener

ContainerAdaptercomponentAdded

componentRemoved

FocusListener

FocusAdapter

focusGained

focusLostItemListener

無itemStateChanged

事件偵聽器接口、適配器類與方法目錄ListenerInterfaceAdapterClassMethodsKeyListener

KeyAdapterkeyPressed

、keyReleased

keyTypedMouseListener

MouseAdapter

mouseClicked

mouseEntered

mouseExited

mousePressed

mouseReleasedMouseMotionListener

MouseMotionAdaptermouseDragged

mouseMoved

TextListener

無textValueChangedWindowListener

WindowAdapterwindowActivated

windowClosed

windowClosing

windowDeactivated

windowDeiconified

windowIconified

windowOpenedJava程序設計2013事件適配器類與事件監聽器接口Adapter類實現了相應Listener接口,但所有方法體都是空的。用戶可以把自己的監聽器類聲明為adapter類的子類,便可以只重寫需要的方法?!璸ublicclassMouseClickHandlerextendsMouseAdapter{ publicvoidmouseClicked(MouseEvente){

…. }}鍵盤事件處理鍵盤事件對象一般由類KeyEvent包裝,記錄從鍵盤上輸入的字符等信息。鍵盤事件的監聽者對應的接口為KeyListener,適配器為KeyAdapterstatic

StringgetKeyText(int

keyCode)

//返回描述keyCode的String,如“HOME”、“F1”或“A”。鍵盤事件處理鍵盤事件對應的類是KeyEvent,其中定義了以下一些常量和方法:KEY_PRESSED

“按下鍵”事件。KEY_RELEASED

:“釋放鍵”事件。KEY_TYPED

:“鍵入鍵”事件。VK_*:代表鍵盤功能鍵chargetKeyChar()

返回與此事件中的鍵相關聯的字符。intgetKeyCode()

返回與此事件中的鍵相關聯的整數keyCode。

intgetKeyLocation()返回產生此按鍵事件的鍵位置。某些鍵在鍵盤上出現多次,如左右shift鍵。另外,某些鍵則出現在數字鍵盤上。此方法提供了一種區分這些鍵的方式。

static

StringgetKeyModifiersText(int

modifiers)

//

返回描述組合鍵的String,如“Shift”或“Ctrl+Shift”。鍵盤事件偵聽器接口java.awt.event.FocusListenerfocusGained(FocusEvente);

//獲得鍵盤焦點(可以輸入字符并被事件源捕捉到)focusLost(FocusEventt);//失去鍵盤焦點(事件源不再接收到鍵盤的輸入)java.awt.event.KeyListenerkeyPressed(KeyEvente)keyReleased(KeyEvente)keyTyped(KeyEvente)實例程序見教材P302Java程序設計2013鍵盤事件處理getKeyCode()

鍵盤上每一個按鈕都有對應碼(Code),可用來查知用戶按了什么鍵,如[Shift]鍵code為16。利用getKeyCode()方法就可以得知這個碼這個方法在keyTyped()上是無法檢測出來的,因為keyTyped()只管用戶輸入的字符,而不會管到鍵盤的對應碼,算是處理比較高層事件的方法因為keyTyped()方法是與鍵盤無關的,因為不同的鍵盤可能有不同的對應碼(如WindowsU.S.keyboard與windowsFrenchkeyboard就有不同的對應碼)。因此需要將getKeyCode()方法寫在keyPressed()或keyReleased()方法中才會有效,因為這兩個方法是處理比較低層的方法。Java程序設計2013鍵盤事件處理getKeyModifiersText()

getKeyModifiersText()方法可返回修飾鍵的字符串,如返回“Shift”字符串或是“Ctrl+Shift”字符串,但應先傳入modifiers參數。可以直接使用getModifiers()方法來得到modifiers參數。這個方法是定義在InputEvent類中,而KeyEvent繼承它,因此就能直接使用這個方法。同樣也必須將getKeyModifiersText()與getModifiers()方法放在keyPressed()或keyReleased()方法中才會有效。2023/1/1146本章總體綱要基本GUI組件布局管理器事件處理模型高級GUI菜單表格MDIJava程序設計2013菜單菜單顯示項目列表,指明各種任務,選擇或單擊某個選項時會打開另一個列表或子菜單。Swing菜單由菜單欄、菜單和菜單項構成,菜單欄是所有菜單和菜單項的根菜單只能加入到具有成員方法(setJMenuBar)的類的實例對象中例如:JFrame

和JAppletJava程序設計2013菜單Menu——菜單系統菜單系統一般菜單可撕下菜單幫助菜單類MenuBar選項#1菜單中的菜單選項#3選項#4選項#1選項#2第三層菜單選項#3選項#1選項#2類Menu類MenuItem選項#2菜單容器非菜單容器Java程序設計2013菜單組件類圖JMenuBarJPopupMenuAbstractButtonJSeperatorJMenuItemJMenuJCheckBoxMenuItemJRadioButtonMenuItemJComponentContainerComponentObjectJava程序設計2013編寫具有菜單(Menu)的程序創建菜單欄:(menubar)給容器設置菜單欄,容器舉例:JFrame、JAppletsetJMenuBar(myBar);創建菜單(menu)設置記憶符(Mnemonic)創建菜單項(menuItem)設置記憶符(Mnemonic)類似于按鈕,設置事件監聽器,進行事件處理Java程序設計2013編寫具有菜單(Menu)的程序將菜單加入到菜單欄中myMenuBar.add(myMenu);如果需要子菜單,則將子菜單加入到菜單中myMenu.add(mySubMenu);將菜單項加入到適當的菜單中myMenu.add(myItem);在菜單項間增加隔(separator)這不是必須的

myMenu.addSeparator();實例程序見教材P305Java程序設計2013JMenuBarJMenuBar是可通過JFrame、JWindow或JInternalFrame的根窗格添加至容器的組件。由多個JMenu組成,每個JMenu在JMenubar中都表示為字符串。JMenuBar需要兩個附加類:SingleSelectionModel類:跟蹤當前選定的菜單LookAndFeel類:負責繪制菜單欄以及對在其中發生的事件作出響應Java程序設計2013JMenuJMenu在JMenuBar下以文本字符串形式顯示,而在用戶單擊它時,則以彈出式菜單顯示。JMenu具有兩個附加類:JPopupMenu:用于顯示JMenu的菜單項LookAndFeel:負責繪制菜單欄中的菜單以及對在其中發生的所有事件作出響應JPopupMenu方法用途publicJMenuItemadd(JMenuItemmenuItem)將指定菜單項附加至菜單末尾publicJMenuItemadd(Strings)使用指定文本新建菜單項,并將其添加至菜單末尾publicvoidshow(Componentc,intx,inty)在組件c的坐標(x,y)位置顯示彈出式菜單publicbooleanisPopupTrigger()確定鼠標事件是否為平臺的彈出觸發器Java程序設計2013JMenuItemJMenu或JPopupMenu中的一個組件,以文本字符串形式顯示,可以具有圖標JMenuItem的外觀可以修改,如字體、顏色、背景、邊框等除字符串外,在JMenuItem中還可以添加圖標Java程序設計2013JCheckBoxMenuItem將復選框作為其項目,復選框是使用JCheckBox類創建的,可有文本字符串和(或)圖標在單擊并釋放JCheckBoxMenuItem時,菜單項的狀態會變為選定或取消選定Java程序設計2013JRadioButtonMenuItem除了在任何時間點都只能選擇一個單選按鈕外,其他的與復選框類似,可有文本字符串和(或)圖標單擊選定的單選按鈕不會改變其狀態單擊未選定的單選按鈕時將取消選定此前選定的單選按鈕菜單使用示例(2)JMenuBarjmb=newJMenuBar();//定義菜單欄

JMenufile=newJMenu("File");//定義菜單

JMenuItemitem1=newJMenuItem("Open");//定義菜單項

JMenuItemitem2=newJMenuItem("Save");JMenuItemitem3=newJMenuItem("Close");JRadioButtonMenuItemJRMenuItem1=newJRadioButtonMenuItem("one",(Icon)newImageIcon("face5.gif"));JRadioButtonMenuItemJRMenuItem2=newJRadioButtonMenuItem(“two”);//定義互斥菜單項,其中的“one”帶圖標

ButtonGroupbgroup=newButtonGroup();//定義選項組對象

JPopupMenupopup=newJPopupMenu("mypopup");//定義彈出式菜單

JMenuItemit1=newJMenuItem("popupone");//定義彈出式菜單的菜單項

JMenuItemit2=newJMenuItem("popuptwo");Java程序設計2013菜單使用示例(3)setJMenuBar(jmb);jmb.add(file);//將菜單File加入菜單欄

file.add(item1);//加入菜單File的各菜單項

file.add(item2);file.add(item3);file.addSeparator();//菜單File中加入一分割線

bgroup.add(JRMenuItem1);//將互斥菜單項加入選項組

bgroup.add(JRMenuItem2);file.

溫馨提示

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

評論

0/150

提交評論