版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2020/8/3,1,Java面向對象程序設計第2版第10章,配合第2版例子源代碼一起使用,Power point 制作:耿祥義 張躍平,Java Swing圖形用戶界面,2020/8/3,2,導讀,2020/8/3,3,10.1 Java Swing概述,Java的java.awt包,即Java抽象窗口工具包(AWT:Abstract Window Toolkit)提供了許多用來設計GUI的組件類。,2020/8/3,4,10.2 窗口,Java提供的JFrame類的實例是一個底層容器,即通常所稱的窗口。其他組件必須被添加到底層容器中,以便借助這個地層容器和操作系統(tǒng)進行信息交互。 JFram
2、e類是Container類的間接子類。當需要一個窗口時,可使用JFrame或其子類創(chuàng)建一個對象。,2020/8/3,5,10.2.1 JFrame常用方法,JFrame() 創(chuàng)建一個無標題的窗口。 JFrame(String s) 創(chuàng)建標題為s的窗口。 public void setBounds(int a,int b,int width,int height 設置窗口的初始位置是(a,b),即距屏幕左面a個像素、距屏幕上方b個像素;窗口的寬是width,高是height。 public void setSize(int width,int height) 設置窗口的大小。 public vo
3、id setLocation(int x,int y) 設置窗口的位置,默認位置是(0,0)。 public void setVisible(boolean b) 設置窗口是否可見,窗口默認是不可見的。 public void setResizable(boolean b) 設置窗口是否可調整大小,默認可調整大小。 public void dispose() 撤消當前窗口,并釋放當前窗口所使用的資源。 public void setExtendedState(int state) 設置窗口的擴展狀態(tài). public void setDefaultCloseOperation(int opera
4、tion) 該方法用來設置單擊窗體右上角的關閉圖標后,程序會做出怎樣的處理。 例題10-1,2020/8/3,6,例題1效果圖,2020/8/3,7,10.2.2 菜單條、菜單、菜單項,1菜單條 JComponent類的子類JMenubar負責創(chuàng)建菜單條,JFrame類有一個將菜單條放置到窗口中的方法:setJMenuBar(JMenuBar bar);該方法將菜單條添加到窗口的頂端 2菜單:JComponent類的子類JMenu負責創(chuàng)建菜單, JMenu類的主要方法有以下幾種 JMenu() 建立一個空標題的菜單。 JMenu(String s) 建立一個指定標題菜單,標題由參數(shù)s確定。 p
5、ublic void add(JMenuItem item) 向菜單增加由參數(shù)item指定的菜單選項。 public JMenuItem getItem(int n) 得到指定索引處的菜單選項。 public int getItemCount() 得到菜單選項的數(shù)目。 3.菜單項 JComponent類的子類JMenuItem負責創(chuàng)建菜單項,JMenuItem類的主要方法有以下幾種: JMenuItem(String s) 構造有標題的菜單項。 JMenuItem(String text, Icon icon) 構造有標題和圖標的菜單項 public void setEnabled(boole
6、an b) 設置當前菜單項是否可被選擇。 public String getText() 得到菜單選項的名字。 public void setText(String name) 設置菜單選項的名字為參數(shù)name指定的字符串。 public void setAccelerator(KeyStroke keyStroke) 為菜單項設置快捷鍵。 4嵌入子菜單 JMenu是JMenuItem的子類,因此菜單本身也是一個菜單項,當把一個菜單看作菜單項添加到某個菜單中時,稱這樣的菜單為子菜單。 5菜單上的圖標:圖標類Icon聲明一個圖標,然后使用其子類ImageIcon類創(chuàng)建一個圖標,如:Icon ic
7、on = new ImageIcon(“a.gif”); 例題10-2,2020/8/3,8,例題2效果圖,2020/8/3,9,10. 3 常用組件與布局,本節(jié)列出一些常用的組件,讀者可以查閱類庫文檔,了解這些組件的屬性以及常用方法,也可以在命令行窗口反編譯組件即時查看組件所具有的屬性及常用方法,例如: C:javap javax.swing.JComponent C:javap javax.swing.JButton,2020/8/3,10,10.3.1 常用組件,1文本框:由JComponent的子類JTextField創(chuàng)建文本框。 2文本區(qū):由JComponent的子類JTexArea
8、創(chuàng)建文本區(qū)。 3按鈕:由JComponent的子類JButton類用來創(chuàng)建按鈕。 4標簽:由JComponent的子類JLabel類用來創(chuàng)建標簽。 5選擇框:由JComponent的子類JCheckBox類用來創(chuàng)建選擇框。 6單選按鈕:由JComponent的子類JRadioButton類用來創(chuàng)建單項選擇框。 7下拉列表:由JComponent的子類JComboBox類用來創(chuàng)建下拉列表。 8密碼框:由JComponent的子類JPasswordField創(chuàng)建密碼框。 密碼框可以使用setEchoChar(char c)重新設置回顯字符 。 密碼框調用char getPassword()方法可以
9、返回實際的密碼。 例子3(Example10_3.java , ComponentInWindow.java )包含有上面提到的常用組件。,2020/8/3,11,例題3效果圖,2020/8/3,12,10.3.2 常用容器,JComponent是Container的子類,因此JComponent子類創(chuàng)建的組件也都是容器。容器經(jīng)常用來添加組件。Jframe是底層容器,本節(jié)提到的容器被習慣地稱做中間容器,中間容器必須被添加到底層容器中才能發(fā)揮作用。 1JPanel 面板:使用JPanel創(chuàng)建面板,再向這個面板添加組件,然后把這個面板添加到其它容器中.JPanel面板的默認布局是FlowLayou
10、t布局。 2滾動窗格JScrollPane:可以將文本區(qū)放到一個滾動窗格中。 JScorollPane scroll=new JScorollPane(new JTextArea(); 3拆分窗格JSplitPane:窗格有兩種類型水平拆分和垂直拆分 JSplitPane的兩個常用的構造方法: JSplitPane(int a,Component b,Component c) JSplitPane(int a, boolean b,Component c,Component d) 4JLayeredPane分層窗格:分層窗格使用 add(Jcomponent com, int layer);添
11、加組件com,并指定com所在的層 public void setLayer(Component c,int layer)可以重新設置組件c所在的層 public int getLayer(Component c)可以獲取組件c所在的層數(shù)。,2020/8/3,13,10.3.3 常用布局_1,容器可以使用方法setLayout(布局對象);設置自己的布局,控制組件在容器中的位置。 1FlowLayout布局 : 1)創(chuàng)建布局對象 FlowLayout flow=new FlowLayout(); 2)容器con使用布局對象con.setLayout(flow); 3)con可以使用Contai
12、ner類提供的add方法將組件順序地添加到容器中; FlowLayout布局對象調用相應的方法可以重新設置布局的對齊方式等. 2BorderLayout布局 : BorderLayout 布局是Window型容器的默認布局 。 使用BorderLayout布局的容器con,可以使用add方法將一個組件b添加到中心區(qū)域:con.add(b,BorderLayout.CENTER); 或 con.add(BorderLayour.CENTER,b);,2020/8/3,14,10.3.3 常用布局_2,3CardLayout 布局 : 使用CardLayout的一般步驟如下: 1)創(chuàng)建CardLa
13、yout對象 CardLayout card=new CardLayout(); 2)為容器設置布局 con.setLayout(card); 3)容器調用add(String s,Component b)將組件b加入容器,并給出了顯示該組件的代號s。 4)布局對象card用CardLayout類提供的show()方法,顯示容器con中組件代號為s的組件:card.show(con,s);,4GridLayout布局 : GridLayout布局策略是把容器劃分成若干行乘若干列的網(wǎng)格區(qū)域,組件就位于這些劃分出來的小格中。 GridLayout布局編輯器的一般步驟如下: 1)創(chuàng)建布局對象,指定劃
14、分網(wǎng)格的行數(shù)m和列數(shù)n GridLayout grid=new new GridLayout(10,8); 2)使用GridLayout布局的容器調用方法add(Component c)將組件c加入容器。 例題4 利用GriderLayout布局模擬的國際象棋棋盤,效果如圖10.5。,2020/8/3,15,例題4效果圖,2020/8/3,16,10.3.3 常用布局_3,5BoxLayout布局:使用盒式布局的容器將組件排列在一行或一列 .BoxLayout布局的一般步驟如下: 1)創(chuàng)建布局對象,使用BoxLayou的構造方法BoxLayout(Container con, int axis
15、)可以創(chuàng)建一個盒式布局對象. 2)可以使用Box類的類(靜態(tài))方法 createHorizontalBox()獲得一個具有行型盒式布局的盒式容器;使用Box類的類(靜態(tài))方法 createVerticalBox()獲得一個具有列型盒式布局的盒式容器。 3)控制盒式布局容器中組件之間的距離 Box類調用靜態(tài)方法createHorizontalStrut(int width)可以得到一個不可見的水平Struct對象,稱做水平支撐.Box類調用靜態(tài)方法createVertialStrut(int height)可以得到一個不可見的垂直Struct對象,稱做垂直支撐。 例子5 代碼鏈接 兩個列型盒式容
16、器boxV1、boxV2和一個行型盒式容器baseBox。 在列型盒式容器的組件之間添加垂直支撐,控制組件之間的距離,將boxV1、boxV2添加到baseBox中,并在它倆之間添加了水平支撐。程序運行效果如圖10.6。 6null布局 : 空布局容器可以準確地定位組件在容器的位置和大小。組件調用setBounds(int a,int b,int width,int height)方法可以設置本身的大小和在容器中的位置。,2020/8/3,17,例題5效果圖,2020/8/3,18,10. 4 處理事件,學習組件除了要熟悉組件的屬性和功能外,一個更重要的方面是學習怎樣處理組件上發(fā)生的界面事件。
17、當用戶在文本框中鍵入文本后按回車鍵、單擊按鈕、在一個下拉式列表中選擇一個條目等操作時,都發(fā)生界面事件。 程序有時需對發(fā)生的事件作出反應,來實現(xiàn)特定的任務,例如,用戶單擊一個名字叫“確定”或名字叫“取消”的按鈕,程序可能需要作出不同的處理。,2020/8/3,19,10.4.1 事件處理模式,1事件源 :能夠產(chǎn)生事件的對象都可以成為事件源 . 2監(jiān)視器 :事件源通過調用相應的方法將某個對象注冊為自己的監(jiān)視器。對于文本框,這個方法是: addActionListener(監(jiān)視器); 事件源注冊監(jiān)視器之后,相應的操作就會導致相應的事件的發(fā)生,并通知監(jiān)視器,監(jiān)視器就會作出相應的處理。,3處理事件的接口
18、: 監(jiān)視器負責處理事件源發(fā)生的事件。監(jiān)視器是一個對象,為了處理事件源發(fā)生的事件,監(jiān)視器這個對象會自動調用一個方法來處理事件。 Java規(guī)定:為了讓監(jiān)視器這個對象能對事件源發(fā)生的事件進行處理,創(chuàng)建該監(jiān)視器對象的類必須聲明實現(xiàn)相應的接口,那么當事件源發(fā)生事件時,監(jiān)視器就自動調用被類重寫的某個接口方法(如圖10.7)。,2020/8/3,20,事件處理模式效果圖,2020/8/3,21,10.4.2 ActionEvent事件,1 ActionEvent事件源 : 文本框、按紐、菜單項、密碼框和單選按紐都可以觸發(fā)ActionEvent事件,即都可以成為ActionEvent事件的事件源。 2注冊監(jiān)視
19、器: 能觸發(fā)ActionEvent事件的組件使用 addActionListener(ActionListener listen) 將實現(xiàn)ActionListener接口的類的實例注冊為事件源的監(jiān)視器。 3ActionListener接口 : ActionListener接口在java.awt.event包中,該接口中只有一個方法: public void actionPerformed(ActinEvent e) 事件源觸發(fā)ActionEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ActionEvent事件,然后調用接口中的方法:actionPerformed(ActinEvent e)對發(fā)生的事件作
20、出處理。ActionEvent類事先創(chuàng)建的事件對象就會傳遞給該方法的參數(shù)e。 4ActionEvent類中的方法 : public Object getSource() 調用該方法可以獲取發(fā)生ActionEvent事件的事件源對象的引用。 public String getActionCommand() 調用該方法可以獲取發(fā)生ActionEvent事件時,和該事件相關的一個命令字符串。,2020/8/3,22,例題6,例子6中,文本框text是JTextField的實例,text的監(jiān)視器listener是實現(xiàn)ActionLiener接口的PoliceListen類創(chuàng)建的對象。在text中輸入數(shù)
21、字字符串并回車,監(jiān)視器負責將text中的字符串轉化為數(shù),然后計算這個數(shù)的平方,并在命令行窗口輸出平方。例子6中的text對象和監(jiān)視器listener都是WindowNumber類創(chuàng)建的窗口中的成員。程序運行效果如圖10.8(a)和10.8(b)。,代碼鏈接,2020/8/3,23,例題7,例子7對例子6進行了改進,WindowNumber創(chuàng)建的窗口中有2個文本框,用戶在可編輯的文本框中輸入數(shù)字、回車確認,另一個不可編輯的文本框顯示這個數(shù)的平方。例子7程序運行效果如圖10.9。,代碼鏈接,2020/8/3,24,10.4.3 ItemEvent事件,1ItemEvent事件源 :選擇框、下拉列表
22、都可以觸發(fā)ItemEvent事件。 2注冊監(jiān)視器:能觸發(fā)ItemEvent事件的組件使用 addItemListener(ItemListener listen) 將實現(xiàn)ItemListener接口的類的實例注冊為事件源的監(jiān)視器。 3ItemListener接口 : ItemListener接口在java.awt.event包中,該接口中只有一個方法: public void itemStateChanged(ItemEvent e) 事件源觸發(fā)ItemEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的ItemEvent事件,然后調用接口中的itemStateChanged(ItemEvent e)方法對發(fā)
23、生的事件作出處理。ItemEvent類事先創(chuàng)建的事件對象就會傳遞給該方法的參數(shù)e。 4 ItemEvent類中的方法 : getSource()方法返回發(fā)生Itemevent事件的事件源外 getItemSelectable()方法返回發(fā)生Itemevent事件的事件源。,2020/8/3,25,例題8,代碼鏈接,例子8 是簡單的計算器(程序運行效果如圖10.10),實現(xiàn)如下功能: (1)用戶在窗口(WindowOperation類負責創(chuàng)建)中的兩個文本框中輸入?yún)⑴c運算的兩個操作數(shù)。 (2)用戶在下拉列選擇運算符觸發(fā)ItemEvent事件,ItemEvent事件的監(jiān)視器operator(Ope
24、ratorListener類負責創(chuàng)建)獲得運算符,并將運算符傳遞給ActionEvent事件的監(jiān)視器computer (3)用戶單擊按鈕觸發(fā)ActionEvent事件,監(jiān)視器computer(ComputerrListener類負責創(chuàng)建)給出運算結果。,2020/8/3,26,10.4.4 DocumentEvent事件,1DocumentEvent事件源 :文本區(qū)所維護的文檔能觸發(fā)DocumentEvent事件 2注冊監(jiān)視器:能觸發(fā)DocumentEven事件的事件源使用 addDucumentListener(DocumentListener listen) 將實現(xiàn)DocumentList
25、ener接口的類的實例注冊為事件源的監(jiān)視器。 3DocumentListener接口 : DocumentListener接口在javax.swing.event包中,該接口中有三個方法: public void changedUpdate(DocumentEvent e) public void removeUpdate(DocumentEvent e) public void insertUpdate(DocumentEvent e),事件源觸發(fā)DucumentEvent事件后,監(jiān)視器將發(fā)現(xiàn)觸發(fā)的DocumentEvent事件,然后調用接口中的相應方法對發(fā)生的事件作出處理。,2020/8/
26、3,27,例題9,代碼鏈接,例子9中,有兩個文本區(qū)。當用戶在一個文本區(qū)中輸入若干英文單詞時(用空格、逗號或回車做為單詞之間的分隔符),另一個文本區(qū)同時對用戶輸入的英文單詞按字典序排序,也就是說隨著用戶輸入的變化,另一個文本區(qū)不斷地更新排序。程序運行效果如圖10.11。,2020/8/3,28,10.4.5 MouseEvent事件_1,任何組件上都可以發(fā)生鼠標事件,如:鼠標進入組件、退出組件、在組件上方單擊鼠標、拖動鼠標等都觸發(fā)鼠標事件,即導致MouseEvent類自動創(chuàng)建一個事件對象。 1使用MouseListener接口可以處理以下5種操作觸發(fā)的鼠標事件 在事件源上按下鼠標鍵、在事件源上釋
27、放鼠標鍵、在事件源上擊鼠標鍵、鼠標進入事件源、鼠標退出事件源。 MouseEvent 中有下列幾個重要的方法: getX() 獲取鼠標指針在事件源坐標系中的x-坐標。 getY() 獲取鼠標指針在事件源坐標系中的y-坐標。 getModifiers() 獲取鼠標的左鍵或右鍵。 getClickCount() 獲取鼠標被單擊的次數(shù)。 getSource() 獲取發(fā)生鼠標事件的事件源。 事件源注冊監(jiān)視器的方法是addMouseListener(MouseListener listener)。 MouseListener接口中有如下方法: mousePressed(MouseEvent) 負責處理在
28、組件上按下鼠標鍵觸發(fā)的鼠標事件 mouseReleased(MouseEvent) 負責處理在組件上釋放鼠標鍵觸發(fā)的鼠標事件 mouseEntered(MouseEvent) 負責處理鼠標進入組件觸發(fā)的鼠標事件 mouseExited(MouseEvent) 負責處理鼠標離開組件觸發(fā)的鼠標事件 mouseClicked(MouseEvent) 負責處理在組件上單擊鼠標鍵觸發(fā)的鼠標事件,2020/8/3,29,例題10,代碼鏈接,例子10中,分別監(jiān)視按鈕、文本框和窗口上的鼠標事件,當發(fā)生鼠標事件時,獲取鼠標指針的坐標值,注意,事件源的坐標系的左上角是原點。,2020/8/3,30,10.4.5
29、MouseEvent事件_2,2使用MouseMotionListener接口可以處理以下兩種操作觸發(fā)的鼠標事件, 在事件源上拖動鼠標、在事件源上移動鼠標。 事件源注冊監(jiān)視器的方法是 addMouseMotionListener(MouseMotionListener listener) MouseMotionListener接口中有如下方法: mouseDragged(MouseEvent) 負責處理拖動鼠標觸發(fā)的鼠標事件。 mouseMoved(MouseEvent) 負責處理移動鼠標觸發(fā)的鼠標事件。,2020/8/3,31,例題11,代碼鏈接,例子11使用坐標變換來實現(xiàn)組件的拖動 。,2
30、020/8/3,32,10.4.6 焦點事件,1焦點事件源 :組件可以觸發(fā)焦點事件。 2注冊監(jiān)視器:組件可以使用 addFocusListener(FocusListener listener) 注冊焦點事件監(jiān)視器。 3FocusListener接口 : 創(chuàng)建監(jiān)視器的類必須要實現(xiàn)FocusListener接口,該接口有兩個方法: public void focusGained(FocusEvent e) public void focusLost(FocusEvent e) 當發(fā)生FocusEvent事件時,監(jiān)視器調用類實現(xiàn)的接口中的相應方法。 4組件也可調用 public boolean r
31、equestFocusInWindow() 方法可以獲得輸入焦點。,2020/8/3,33,10.4.7 鍵盤事件,當一個組件處于激活狀態(tài)時,敲擊鍵盤上一個鍵就導致這個組件觸發(fā)鍵盤事件。 1.某個組件使用addKeyListener方法注冊監(jiān)視器。 2.接口KeyListener中有如下方法: public void keyPressed(KeyEvent e), public void keyTyped(KeyEvent e), public void KeyReleased(KeyEvent e) 3.相關方法: public int getKeyCode()判斷哪個鍵被按下、敲擊或釋放,
32、返回一個鍵碼值 。 getKeyChar()判斷哪個鍵被按下、敲擊或釋放,返回鍵上的字符。 參考表10.1 鍵碼表,2020/8/3,34,例題12,代碼鏈接,例子12通過處理鍵盤事件來實現(xiàn)軟件序列號的輸入。當文本框獲得輸入焦點后,用戶敲擊鍵盤將使得當前文本框觸發(fā)KeyEvent事件,在處理事件時,程序檢查文本框中光標的位置,如果光標已經(jīng)到達指定位置,就將輸入焦點轉移到下一個文本框。程序運行效果如圖10.12。,2020/8/3,35,10.4.8 窗口事件,JFrame及子類創(chuàng)建的窗口可以調用 setDefaultCloseOperation(int operation); 方法設置窗口的關
33、閉方式,Operation取JFrame的static常量: DO_NOTHING_ON_CLOSE(什么也不做) HIDE_ON_CLOSE(隱藏當前窗口) DISPOSE_ON_CLOSE(隱藏當前窗口,并釋放窗體占有的其它資源) EXIT_ON_CLOSE(結束窗口所在的應用程序) 但是setDefaultCloseOperation方式可能不能滿足程序的需要,比如,用戶單擊窗口上的關閉圖標時,可能程序需要提示用戶是否需要保存窗口中的有關數(shù)據(jù)到磁盤等 . 這些要通過處理事件來滿足程序的要求。需要注意的是,如果準備處理窗口事件,必須事先保證窗口的默認關閉方式為DO_NOTHING_ON_C
34、LOSE(什么也不做)。,2020/8/3,36,1WindowEvent事件源,(1) public void windowActivated(WindowEvent e) 當窗口從非激活狀態(tài)到激活時,窗口的監(jiān)視器調用該方法。 (2) public void windowDeactivated(WindowEvent e) 當窗口激活狀態(tài)到非激活狀態(tài)時,窗口的監(jiān)視器調用該方法。 (3) public void windowClosing(WindowEvent e) 當窗口正在被關閉時,窗口的監(jiān)視器調用該方法。 (4) public void windowClosed(WindowEvent
35、 e) 當窗口關閉后,窗口的監(jiān)視器調用該方法。 (5) public void windowIconified(WindowEvent e) 當窗口圖標化時,窗口的監(jiān)視器調用該方法。 (6) public void windowDeiconified(WindowEvent e) 當窗口撤消圖標化時,窗口的監(jiān)視器調用該方法。 (7) public void windowOpened(WindowEvent e) 當窗口打開時,窗口的監(jiān)視器調用該方法。,2.WindowListener接口.,JFrame是Window的子類,凡是Window子類創(chuàng)建的對象都可以發(fā)生WindowEvent事件,即
36、窗口事件。,2020/8/3,37,3. WindowAdapter適配器 .,適配器可以代替接口來處理事件,當Java提供處理事件的接口中多于一個方法時,Java相應地就提供一個適配器類,比如WindowAdapter類。適配器已經(jīng)實現(xiàn)了相應的接口,例如WindowAdapter類實現(xiàn)了WindowListener接口。因此,可以使用WindowAdapte的子類創(chuàng)建的對象做監(jiān)視器,在子類中重寫所需要的接口方法即可。 例子13(Example10_13.java ) 使用適配器做監(jiān)視器,只處理窗口關閉事件,因此只需重寫windowColsing方法即可。,2020/8/3,38,10.4.9
37、 匿名類實例或窗口做監(jiān)視器,1匿名類的實例做監(jiān)視器: 匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類中仍然有效,當發(fā)生事件時,監(jiān)視器就比較容易操作事件源所在的外嵌類中的成員.當事件的處理比較簡單、系統(tǒng)也不復雜時,使用匿名類做監(jiān)視器是一個不錯的選擇。 2窗口做監(jiān)視器: 讓事件源所在的類的實例作為監(jiān)視器,能讓事件的處理比較方便,這是因為,監(jiān)視器可以方便的操作事件源所在的類中的其他成員。當事件的處理比較簡單,系統(tǒng)也不復雜時,讓事件源所在的類的實例作為監(jiān)視器是一個不錯的選擇。,例子14 Example10_14.java 是一個猜數(shù)字小游戲,2020/8/3,39,10.4.10 事件總結,1授權
38、模式 Java的事件處理是基于授權模式,即事件源調用調用方法將某個對象注冊為自己的監(jiān)視器。 2接口回調 addXXXListener(XXXListener listener)方法中的參數(shù)是一個接口,listener可以引用任何實現(xiàn)了該接口的類所創(chuàng)建的對象,當事件源發(fā)生事件時,接口listener立刻回調被類實現(xiàn)的接口中的某個方法。 3.方法綁定 當事件源觸發(fā)事件發(fā)生后,監(jiān)視器準確知道去調用哪個方法。 4.保持松耦合 當事件源觸發(fā)事件發(fā)生后,系統(tǒng)知道某個方法會被執(zhí)行,但無須關心到底是哪個對象去調用了這個方法,因為任何實現(xiàn)接口的類的實例(做為監(jiān)視器)都可以調用這個方法來處理事件。,2020/8/
39、3,40,10. 5 使用MVC結構,模型-視圖-控制器(Model-View-Controller),簡稱為MVC。 MVC是一種先進的設計結構,其目的是以會話形式提供方便的GUI支持。 MVC是一種通過三個不同部分構造一個軟件或組件的理想辦法: 模型(model) 用于存儲數(shù)據(jù)的對象。 視圖(view) 為模型提供數(shù)據(jù)顯示的對象。 控制器(controller)處理用戶的交互操作,對于用戶的操作作出響應,讓模型和視圖進行必要的交互,即通過視圖修改、獲取模型中的數(shù)據(jù);當模型中的數(shù)據(jù)變化時,讓視圖更新顯示。,2020/8/3,41,例題15,代碼鏈接,首先編寫一個封裝三角形的類(模型角色) 然
40、后再編寫一個窗口。要求窗口使用三文本框和一個文本區(qū)為三角形對象中的數(shù)據(jù)提供視圖,其中三個文本框用來顯示和更新三角形對象的三個邊的長度;文本區(qū)對象用來顯示三角形的面積。 窗口中有一個按鈕(控制器角色),用戶單擊該按鈕后,程序用3個文本框中的數(shù)據(jù)分別作為三角形的三個邊的長度,并將計算出的三角形的面積顯示在文本區(qū)中。程序運行效果如圖10.14。,2020/8/3,42,10. 6 樹組件與表格組件, 10.6.1 樹組件,1DefaultMutableTreeNode節(jié)點,DefaultMutableTreeNode類的兩個常用的構造方法是:,2樹上的TreeSelectionEvent事件,使用a
41、ddTreeSelectionListener(TreeSelectionListener listener)方法獲得一個監(jiān)視器。當用鼠標單擊樹上的節(jié)點時,系統(tǒng)將自動用TreeSelectionEvent創(chuàng)建一個事件對象,通知樹的監(jiān)視器,監(jiān)視器將自動調用TreeSelectionListener接口中的方法。,創(chuàng)建監(jiān)視器的類必須實現(xiàn)TreeSelectionListener接口,此接口中的方法是 public void valueChanged(TreeSelectionEvent e) 。 樹使用getLastSelectedPathComponent()方法獲取選中的節(jié)點。,Default
42、MutableTreeNode(Object userObject) DefaultMutableTreeNode(Object userObject,boolean allowChildren),2020/8/3,43,例題16,代碼鏈接,例16中節(jié)點中存放的對象由Goods類(描述商品)創(chuàng)建,當用戶選中節(jié)點時,窗口中的文本區(qū)顯示節(jié)點中存放的對象的有關信息,程序運行效果如圖10.15。,2020/8/3,44,10.6.2 表格組件,表格組件以行和列的形式顯示數(shù)據(jù),允許對表格中的數(shù)據(jù)進行編輯。表格的模型功能強大、靈活并易于執(zhí)行。表格是最復雜的組件,對于初學者,這里只介紹默認的表格模型。 JT
43、able有7個構造方法,這里介紹常用的三個。 JTable() 創(chuàng)建默認的表格模型。 JTable(int a,int b) 創(chuàng)建a行,b列的默認模型表格 JTable (Object data,Object columnName) 創(chuàng)建默認表格模型對象,并且顯示由data指定的二維數(shù)組的值,其列名由數(shù)組columnName指定。 通過對表格中的數(shù)據(jù)進行編輯,可以修改表格中二維數(shù)組data中對應的數(shù)據(jù)數(shù)據(jù)。在表格中輸入或修改數(shù)據(jù)后,需按回車或用鼠標單擊表格的單元格確定所輸入或修改的結果。當表格需要刷新顯示時,讓表格調用repaint方法。,2020/8/3,45,例題17,代碼鏈接,例子17是
44、一個成績單錄入程序(效果如圖10.16),客戶通過一個表格的單元格輸入學生的數(shù)學和英語成績。單擊按鈕后,將總成績放入相應的表格單元中。因為Object類是所有類的默認父類,所以在表格中輸入一個數(shù)值時被認為是一個Object對象。Object類有一個很有用的方法:toString(),它可以得到對象的字符串表示 。,2020/8/3,46,10. 7 按鈕綁定到鍵盤_1,1AbstractAction類與特殊的監(jiān)視器 Java對監(jiān)視按鈕的鍵盤操作的監(jiān)視器的要求:要求創(chuàng)建監(jiān)視器的類必須實現(xiàn)ActionListener接口的子接口Action。 如果按鈕通過addActionListener()方法
45、注冊的監(jiān)視器和程序為按鈕的鍵盤操作指定的監(jiān)視器是同一個監(jiān)視器,那么用戶直接敲擊某個鍵就可代替用鼠標單擊該按鈕所產(chǎn)生的效果,這也就是人們通常理解的按鈕的鍵盤綁定。 抽象類javax.swing.AbstractAction類已經(jīng)實現(xiàn)了Action接口,因為大部分應用不需要實現(xiàn)Action中的其他方法,因此編寫AbstractAction類的子類時,只要重寫 public void actionPerform(ActionEvent e) 方法即可。 為按鈕的鍵盤操作指定了監(jiān)視器后,用戶只要敲擊相應的鍵,監(jiān)視器就執(zhí)行actionPerformed()方法。,2020/8/3,47,10. 7 按鈕
46、綁定到鍵盤_2,2指定監(jiān)視器的步驟 以下假設按鈕是button,listener是AbstractAction類的子類的實例。 (1)獲取輸入映射按鈕首先調用 public final InputMap getInputMap(int condition) 方法返回一個InputMap對象,其中參數(shù)condition取值JComponent類的下列static常量: WHEN_FOCUSED(僅在擊鍵發(fā)生、同時組件具有焦點時才調用操作), WHEN_IN_FOCUSED_WINDOW(當擊鍵發(fā)生、同時組件具有焦點時,或者組件處于具有焦點的窗口中時調用操作。注意,只要窗口中的任意組件具有焦點,就
47、調用向此組件注冊的操作), WHEN_ANCESTOR_OF_FOCUSED_COMPONENT(當擊鍵發(fā)生、同時組件具有焦點時,或者該組件是具有焦點的組件的祖先時調用該操作)。例如:InputMap inputmap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); (2)綁定按鈕的鍵盤操作 返回的輸入映射首先調用方法 public void put(KeyStroke keyStroke,Object actionMapKey) 將敲擊鍵盤上的某鍵指定為按鈕的鍵盤操作,并為該操作指定一個Object類型的映射關鍵字,例如:in
48、putmap.put(KeyStroke.getKeyStroke(A),dog); (3)為按鈕的鍵盤操作指定監(jiān)視器 按鈕調用方法 public final ActionMap getActionMap()返回一個ActionMap對象: ActionMap actionmap = button.getActionMap(); 然后該對象actionmap調用方法public void put(Object key,Action action) 為按鈕的鍵盤操作指定監(jiān)視器,例如:actionmap.put(dog,listener);,2020/8/3,48,例題18,代碼鏈接,例子18中,用鼠標單擊按鈕或敲擊鍵盤的A鍵,程序將移動按鈕。,2020/8/3,49,10. 7 按鈕綁定到鍵盤_3,3注意事項 實際上,為按鈕的鍵盤操作指定的監(jiān)視器和按鈕本身使用addActionLister
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 年產(chǎn)30萬張高端木門、20萬套門套項目環(huán)境影響報告表
- 測振儀使用方法培訓課件
- 菌棒購銷合同模板
- 2026 執(zhí)業(yè)藥師備考避坑指南
- 樹人托管老師培訓
- 活動策劃執(zhí)行教學培訓
- 2026年通信技術中知識產(chǎn)權保護的實踐與探索試題
- 2026年托福高分必刷題庫及參考答案集
- 2026年建筑工程設計資質考試案例分析與技術實踐
- 2026年財經(jīng)知識題庫投資理財模擬題
- 婦科微創(chuàng)術后護理新進展
- 工藝類美術課件
- 2025年小學蔬菜頒獎典禮
- MFC2000-6微機廠用電快速切換裝置說明書
- TCNAS50-2025成人吞咽障礙患者口服給藥護理學習解讀課件
- 專升本演講稿
- 2024低溫低濁水給水處理設計標準
- 門窗知識文字培訓課件
- 《房屋市政工程生產(chǎn)安全重大事故隱患判定標準(2024版)》解讀
- 2025年國資委公務員面試熱點問題集錦及答案
- 計算機系大數(shù)據(jù)畢業(yè)論文
評論
0/150
提交評論