java圖形界面程序設計補充講稿.doc
《java圖形界面程序設計補充講稿.doc》由會員分享,可在線閱讀,更多相關《java圖形界面程序設計補充講稿.doc(31頁珍藏版)》請在裝配圖網(wǎng)上搜索。
圖形界面程序設計 Part I:界面設計 使用圖形組件類和容器類進行GUI設計時,需要引入相應的包或者類。在Java 中,能夠實現(xiàn)圖形用戶界面的類庫有兩個:java.awt 和javax.swing。前者稱為抽象窗口工具庫AWT(Abstract Windows Toolkit),后者是Java 基礎類庫JFC(Java Foundation Classes)的一個組成部分,它提供了一套功能更強、數(shù)量更多、更美觀的圖形用戶界面組件。Swing 組件名稱和AWT 組件名稱基本相同,但以J 開頭,例如AWT 按鈕類的名稱是Button,在Swing 中的名稱則是JButton。在java中,AWT包中的類是用來處理圖形的最基本的方式,它是Sun公司早期所推出和使用的圖形組件包,其中的組件包含基本GUI組件類、容器類、布局管理類,事件處理類和基本圖形類這五種。AWT包中的組件被認為是重量級組件,AWT在實際運行中是調用所在平臺的圖形系統(tǒng),它們依賴于本地系統(tǒng)來支持繪圖與顯示,其運行速度慢效果差,系統(tǒng)相關性較強。在1998年Sun Microsystem推出JDK1.2版本時,新的javax.Swing包被增加到java的基礎類庫中。Swing包可以認為是AWT包的升級。它不僅擁有幾倍于AWT包的用戶界面組件,而且同樣的組件,Swing包中的組件往往可設置屬性更多,功能更強大豐富。例如Swing包中按鈕(Button)的功能較AWT包中的按鈕功能更加強大,包括給按鈕添加圖像、使用快捷鍵以及設置按鈕的對齊方式,還可以給按鈕加入圖片做背景。 Swing采用MVC(模型-視圖-控制)的設計范式,使程序員可以根據(jù)不同的操作系統(tǒng)來選擇不同的外觀。Swing組件完全是用Java代碼實現(xiàn)的,可以跨平臺,使用Swing組件的程序在Mac、Windows或Unix平臺上的觀感都一樣。Swing組件通常被稱為輕量級組件。程序設計過程中最好不要混用Swing組件和AWT組件,雖然有時候也可以同時用,但有可能在視覺效果和響應上造成不穩(wěn)定隱患。 AWT包中常用的頂層容器為Frame、Dialog、Applet,中間層容器為Panel(中間層容器是一種可以放到頂層容器上的組件,它可以把頂層容器進行進一步的區(qū)域劃分以設計所需格局的界面)。常用的普通組件有Button、TextField、TextArea、Label、List等。 Swing包中的組件分類主要為: (1)頂層容器:JFrame、JApplet、JDialog。 (2)中間層容器:JPanel、JScrollPane、JSplitPane、JToolBar。 (3)其它基本組件:JButton、JList、JTextField等。 關于布局,其實每種容器都有默認的布局,當設計者沒有指定使用另外的布局時,放到它上面的組件就會按默認布局方式擺放。在AWT和Swing中都可對容器設置布局,都是調用容器對象的setLayout方法。布局有幾種,這里作簡單說明,具體請大家從示例程序的運行以及JDK API文檔中查閱這些布局類的說明文檔來體會: (1)FlowLayout布局:順序布局,有時又稱流式布局。使用該布局時,容器上的元素會按容器顯示時的大小,按照從左到右、從上倒下的一行一行擺放下去。 (2)BorderLayout布局:邊界布局。它可以把容器分為東西南北中5個方位,可以指定某個組件在哪個方位(但注意并非一定要有5個組件擺上去,不足5個也可指定位置擺放)。 (3)GridLayout布局:網(wǎng)格布局??梢灾付ㄈ萜魃系脑匕磶仔袔琢械奈恢庙樞驍[放。 (4)CardLayout布局:卡片布局。使用該布局的容器可放置多個組件,但同一時刻只能顯示其中一個,就像一疊疊整齊的紙牌中每次只能最上面一張一樣。可以指定哪個組件被顯示。 (5)null布局:空布局??詹季植⒎菦]有布局,而是容器被設置為這種布局以后,放到它上面的每個組件就可以通過setBounds(int a,int b,int width,int height)來設置其具體的位置。 (6)另外還有BoxLayout(盒式布局)、GridBagLayout(網(wǎng)格包布局)等不常用布局。 在具體的程序設計時,上述每一種布局都對應是一個類,用它們定義出來的對象作為容器對象的setLayout方法的參數(shù),就可以把容器設置成該參數(shù)所對應的布局了。 仔細閱讀、體會、運行和模仿學習后面的多個例子程序(注意代碼注釋中所提示的各種細節(jié)問題),我們可以最后再次總結出“界面設計”的步驟: (1)定義頂層容器對象。 (2)用容器對象的setLayout方法給容器設置一種布局。 (3)定義普通圖形組件。 (4)調用容器對象的add方法將普通圖形組件添加到容器上。 其中步驟(1)和(3)一般放在圖形界面程序類的成員變量聲明部分。(2)和(4)一般放在類的構造函數(shù)部分。 最后在main函數(shù)中生成圖形界面程序類的實例運行,顯示出界面來。 /* * 例子3.1,關于容器Frame的使用。 */ import java.awt.Frame; public class FrameApp { public static void main(String[] args) { Frame frame=new Frame(); //定義一個Frame容器對象frame frame.setSize(200,100); frame.setVisible(true); //注意Frame對象默認是不可見的,嘗試注釋掉此句,你會發(fā)現(xiàn)看 //不到運行結果的窗口出現(xiàn)。 } } /* * 例子3.2,關于容器JFrame的使用。 同上例。 */ import javax.swing.JFrame; public class JButtonApp { public static void main(String[] args) { JFrame jframe = new JFrame(); // 定義一個JFrame容器對象jframe jframe.setSize(200, 100); jframe.setVisible(true);// 注意JFrame對象默認是不可見的,若注釋掉此句,你會發(fā)現(xiàn)看 // 不到運行結果的窗口出現(xiàn)。 jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//JFrame表面上可以關閉, // 實際上只是被隱藏為不顯示。要真正可以關閉它,必須讓JFrame對象 // 調用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)這樣的方法來實現(xiàn)關閉功能。 } } /* * 例子3.3,本例演示使用容器JFrame,設計一個基本的圖形界面程序的過程和方法。請注意注釋 * 所提示的一些應該注意的細節(jié)問題。 */ import java.awt.FlowLayout; import java.awt.Font; import java.awt.Color; import javax.swing.JButton; import javax.swing.JFrame; public class JButtonApp{ JFrame jf=new JFrame(); //定義設計圖形界面程序所需的容器對象 JButton button1=new JButton("按鈕1"); //定義界面上需要的按鈕button1,以下類似 JButton button2=new JButton("按鈕2"); JButton button3=new JButton("按鈕3"); public JButtonApp(){ //一般總是用構造函數(shù)用于把普通組件添加到容器上構造出界面來! jf.setLayout(new FlowLayout());//當沒有使用任何布局的時候,JFrame容器只會顯示代碼中最 //后使用add方法添加上去的組件。假如這條設置布局的語句被 //注釋掉的話,程序運行后界面上將會只顯示按鈕3這一個按鈕 jf.getContentPane().add(button1);//往容器上面添加按鈕button1。注意如果是往AWT中的Frame //容器對象上面添加任何組件的話,都是調用該對象的add方 //法,以組件對象名作為參數(shù)添加即可。但對于Swing中的 //JFrame,必須先通過getContentPane()方法獲取其內(nèi)容面 //板,然后再調用add方法添加組件。 jf.getContentPane().add(button2); jf.getContentPane().add(button3); jf.getContentPane().setBackground(Color.RED); //把jf的背景色設置為紅色。 button1.setFont(new Font("隸書",Font.PLAIN,20)); //給按鈕button1設置字體。 jf.setVisible(true);//JFrame容器對象默認是不可見的,必須要設置為可見,界面才會出來。 jf.pack(); //如果嘗試不調用pack函數(shù),默認出來的界面不會顯示全部組件。pack的作用是使 //界面上的所有組件以最經(jīng)濟的方式全部顯示出來。 } public static void main(String[] args) { JButtonApp jba=new JButtonApp(); //生成對象實例,在此過程中構造函數(shù)會被調用 //運行,界面即出現(xiàn) } } /* * 例子3.4,本例演示容器Applet的使用。 */ import java.applet.Applet; import javax.swing.JTextField; public class JTextFieldApp extends Applet //這是一個Applet程序,Applet實際上也是一種容器! { JTextField jtxtfld1,jtxtfld2; //定義兩個JTextField類型的組件 public void init() { jtxtfld1=new JTextField(20); //生成對象實例 jtxtfld2=new JTextField(20); add(jtxtfld1); //將組件添加到容器Applet上 add(jtxtfld2); jtxtfld2.setEditable(false); //將其中的jtxtfld2設置為不可編輯的,即不能往里輸入東西 } } /* * 例子3.5,本例演示FlowLayout布局(順序布局)的使用。這種布局就是按照調用add方法添加組件的順序 * 從左到右、從上到下擺放組件,下面的程序中的5個按鈕就是按照這樣布局的。 */ import java.awt.*; import java.awt.event.*; public class FlowLayoutApp extends Frame //這個例子程序不是在程序中定義Frame容器對象作為 //容器,而是繼承自Frame類。這隱含著是以Frame作 //為頂層容器。 { public FlowLayoutApp() //構造函數(shù) { super("An FlowLayout Example"); //調用父類的構造函數(shù)設置頂層容器的標題 setLayout(new FlowLayout()); setBackground(Color.green); //以綠色作為界面的背景色 setVisible(true); //容器設置為可見 add(new Button("按鈕1")); //添加一個按鈕到容器上面 add(new Button("按鈕2")); add(new Button("按鈕3")); add(new Button("按鈕4")); add(new Button("按鈕5")); pack(); //使界面上的元素在程序一運行之后,就全部顯示出來。 } public static void main(String args[]) { FlowLayoutApp fla=new FlowLayoutApp(); //生成對象實例 } } /* * 例子3.6,本例演示BorderLayout布局(邊界布局)的使用。這種布局會把容器上的組件按照 * 東西南北中各個方位進行排列??梢酝ㄟ^參數(shù)具體指定某個組件在東西南北中的哪一個方向。 * 通過這種布局,可以把容器細分為幾個部分,以便設置更好的界面。請注意并不是一定要東 * 西南北中五個方向都要放組件的。不足五個的組件同樣可以分別被指定放在容器上東西南北 * 中的任何一個方位。自己可以嘗試放置少于五個組件的情況。 */ import javax.swing.JButton; import javax.swing.JFrame; public class BorderLayoutApp { JFrame jf; JButton eastButton; JButton southButton; JButton westButton; JButton northButton; JButton centerButton; public BorderLayoutApp() { jf=new JFrame("這是一個演示BorderLayout布局的例子程序"); eastButton=new JButton("東按鈕"); southButton=new JButton("南按鈕"); westButton=new JButton("西按鈕"); northButton=new JButton("北按鈕"); centerButton=new JButton("中央按鈕"); jf.add(eastButton,"East"); //注意:Frame容器的默認布局就已經(jīng)是BorderLayout jf.add(southButton,"South"); jf.add(westButton,"West"); jf.add(northButton,"North"); jf.add(centerButton,"Center"); jf.setVisible(true); jf.pack(); } public static void main(String args[]) { BorderLayoutApp bla=new BorderLayoutApp(); } } /* 例子3.7,本例演示null布局(順序布局)的使用。有時會用到null布局(即無布局管理器),程序員必須自己為容器中的組件設置大小和位置,因此其好處是可以隨心所欲地設置組件的大小和位置得到自己想要的布局,但跨平臺使用時,界面可能發(fā)生變化,且程序編寫和調試相對比較繁瑣,示例如下。 */ import javax.swing.JButton; import javax.swing.JFrame; public class NullLayoutApp { JFrame jfr=new JFrame("null布局的使用示例"); JButton b1=new JButton("open"); JButton b2=new JButton("close"); JButton b3=new JButton("ok"); public NullLayoutApp(){ //構造函數(shù),用于生成圖形程序的界面 jfr.setSize(300,300); //設置容器對象jfr的寬度和高度 jfr.setLayout(null); //設置為null布局。注意null四個字母全部小寫! b1.setSize(80,20); //設置按鈕b1的寬度和高度 b1.setLocation(10,30); //設置按鈕b1在界面上的左上角的位置坐標 b2.setSize(90,40); b2.setLocation(40,60); b3.setSize(100,50); b3.setLocation(100,80); jfr.add(b1); //依次將每個組件添加到容器上 jfr.add(b2); jfr.add(b3); jfr.setResizable(true); jfr.setVisible(true); //jfr.pack(); 注意:使用null布局之后,pack方法反而不需要使用了! } public static void main(String args[]) { NullLayoutApp nla=new NullLayoutApp(); //定義對象實例,調用構造函數(shù)生成界面 } } Swing的一些應用示例 1、 Swing和AWT的區(qū)別 2、 容器類:JFrame、JApplet、JDialog、JComponent 普通組件類:JButton、JTextField、JTextArea、JLabel。。。。。。 輔助類:Color、Font、LayoutManager。。。。。。 下面的例子都將基于Swing。 3、 創(chuàng)建一個框架 import javax.swing.JFrame; public class MyFrame{ public static void main(String[] args) { JFrame frame = new JFrame("我的第一個界面"); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 4、 向框架中添加組件: import javax.swing.JButton; import javax.swing.JFrame; public class MyFrame{ public static void main(String[] args) { JFrame frame = new JFrame("我的第一個界面"); JButton button= new JButton("按鈕"); frame.add(button); //JDK5之后允許直接如此調用將組件放在內(nèi)容面板中 frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 5、 布局管理器,此例開始盡量將界面設計放在構造函數(shù)中,便于類被復用等。 //先看一個FlowLayout的例子 import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; public class MyFrame extends JFrame{ MyFrame() { setLayout(new FlowLayout(FlowLayout.LEFT,10,20)); add(new JLabel("學號:")); add(new JTextField(8)); add(new JLabel("性別")); add(new JTextField(2)); add(new JLabel("姓名:")); add(new JTextField(8)); } public static void main(String[] args) { MyFrame frame = new MyFrame(); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 6、 GridLayout,寫一個例子或改改上例試試看? 行數(shù)列數(shù)不能同時為0. 行列都不為0的情況下,行數(shù)是主導參數(shù)。 7、 BorderLayout,寫一個例子測試看看。 8、 用JPanel(面板)作為子容器細化界面設計: import java.awt.*; import javax.swing.*; public class TestPanels extends JFrame { public TestPanels() { // Create panel p1 for the buttons and set GridLayout JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(4, 3)); // Add buttons to the panel for (int i = 1; i <= 9; i++) { p1.add(new JButton("" + i)); } p1.add(new JButton("" + 0)); p1.add(new JButton("Start")); p1.add(new JButton("Stop")); // Create panel p2 to hold a text field and p1 JPanel p2 = new JPanel(new BorderLayout()); p2.add(new JTextField("Time to be displayed here"), BorderLayout.NORTH); p2.add(p1, BorderLayout.CENTER); // add contents into the frame add(p2, BorderLayout.EAST); add(new JButton("Food to be placed here"), BorderLayout.CENTER); } /** Main method */ public static void main(String[] args) { TestPanels frame = new TestPanels(); frame.setTitle("The Front View of a Microwave Oven"); frame.setSize(400, 250); frame.setLocationRelativeTo(null); // Center the frame frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 9、 Color類 如 : Color color = new Color(128,100,100); import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; public class MyFrame extends JFrame{ MyFrame() { setLayout(new FlowLayout(FlowLayout.LEFT,10,20)); JButton button = new JButton("按鈕"); add(new JLabel("學號:")); add(new JTextField(8)); add(new JLabel("性別")); add(new JTextField(2)); add(new JLabel("姓名:")); add(new JTextField(8)); Color color = new Color(150,100,100); button.setBackground(color); //或改成RED試試? button.setForeground(Color.blue); add(button); } public static void main(String[] args) { MyFrame frame = new MyFrame(); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 10、 Font類 public Font(String name, int style, int size); import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; public class MyFrame extends JFrame{ MyFrame() { setLayout(new FlowLayout(FlowLayout.LEFT,10,20)); JButton button = new JButton("按鈕"); add(new JLabel("學號:")); add(new JTextField(8)); add(new JLabel("性別")); add(new JTextField(2)); add(new JLabel("姓名:")); add(new JTextField(8)); Color color = new Color(150,100,100); button.setBackground(color); //或改成RED試試? button.setForeground(Color.blue); Font font = new Font("黑體",Font.PLAIN,22); //字體設置 button.setFont(font); add(button); } public static void main(String[] args) { MyFrame frame = new MyFrame(); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 11、看點GUI組件的一些其它普遍特性,比如給面板設置邊界,給按鈕設置提示(鼠標放上去會有提示): import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.TitledBorder; public class MyFrame extends JFrame{ MyFrame() { setLayout(new FlowLayout(FlowLayout.LEFT,10,20)); JPanel jp = new JPanel(new FlowLayout()); //在上例基礎使用面板 JButton button = new JButton("按鈕"); jp.add(new JLabel("學號:")); jp.add(new JTextField(8)); jp.add(new JLabel("性別")); jp.add(new JTextField(2)); jp.add(new JLabel("姓名:")); jp.add(new JTextField(8)); add(jp); jp.setBorder(new TitledBorder("一些組件放在本JPanel中"));//給面板設置邊界 button.setToolTipText("請點擊本按鈕繼續(xù)"); //鼠標放到按鈕上會有提示 Color color = new Color(150,100,100); button.setBackground(color); //或改成RED試試? button.setForeground(Color.blue); Font font = new Font("黑體",Font.PLAIN,22); //字體設置 button.setFont(font); add(button); } public static void main(String[] args) { MyFrame frame = new MyFrame(); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 12、其實上面所說的顏色、邊界、鼠標提示等是一般GUI組件都有的特性。比如下例在上面的例子基礎上給一個添加進去的JTextField也增加了提示。 import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.TitledBorder; public class MyFrame extends JFrame{ MyFrame() { setLayout(new FlowLayout(FlowLayout.LEFT,10,20)); JPanel jp = new JPanel(new FlowLayout()); //在上例基礎使用面板 JButton button = new JButton("按鈕"); JTextField jt = new JTextField(16); //在上例基礎上增加文本框 jp.add(new JLabel("學號:")); jp.add(new JTextField(8)); jp.add(new JLabel("性別")); jp.add(new JTextField(2)); jp.add(new JLabel("姓名:")); jp.add(new JTextField(8)); add(jp); jp.setBorder(new TitledBorder("一些組件放在本JPanel中"));//給面板設置邊界 button.setToolTipText("請點擊本按鈕繼續(xù)"); //鼠標放到按鈕上會有提示 Color color = new Color(150,100,100); button.setBackground(color); //或改成RED試試? button.setForeground(Color.blue); Font font = new Font("黑體",Font.PLAIN,22); //字體設置 button.setFont(font); add(button); jt.setToolTipText("請在此輸入內(nèi)容"); //給文本框設置提示內(nèi)容 add(jt); } public static void main(String[] args) { MyFrame frame = new MyFrame(); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 13、圖像圖標(先得準備一點測試用的圖片) ImageIcon icon = new ImageIcon(“image/pic.gif”); import javax.swing.*; import java.awt.*; public class TestImageIcon extends JFrame { private ImageIcon usIcon = new ImageIcon("image/us.gif"); private ImageIcon myIcon = new ImageIcon("image/my.jpg"); private ImageIcon frIcon = new ImageIcon("image/fr.gif"); private ImageIcon ukIcon = new ImageIcon("image/uk.gif"); public TestImageIcon() { setLayout(new GridLayout(1, 4, 5, 5)); add(new JLabel(usIcon)); add(new JLabel(myIcon)); add(new JButton(frIcon)); add(new JButton(ukIcon)); } /** Main method */ public static void main(String[] args) { TestImageIcon frame = new TestImageIcon(); frame.setTitle("TestImageIcon"); frame.setSize(500, 125); frame.setLocationRelativeTo(null); // Center the frame frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 14、更多其它組件應用和測試:JList、JComboBox、JCheckBox、JRadioButton、JScrollBar等 圖形界面程序設計 Part II:事件處理 15、事件 和 事件源 事件:點擊按鈕、鍵盤輸入、鼠標移動。 事件源:如按鈕等。 圖形界面程序是事件驅動的,當用戶與程序之間交互時產(chǎn)生事件,觸發(fā)程序中的事件處理代碼。事件一般分為用戶事件和系統(tǒng)事件。通常關注比較多的是用戶事件。典型的交互和要處理的用戶事件包括用戶移動鼠標、單擊鼠標,點擊按鈕、點擊下拉列表框或選項卡、在文本框中輸入內(nèi)容后回車、點擊菜單項或關閉圖形窗口等。 事件處理,處理的是誰的事件?實際上處理的就是界面上的組件的事件。比如被點擊的按鈕,被輸入內(nèi)容后按下了回車鍵的單行文本框等等。事件的處理并非自動完成。事件發(fā)生后,應該產(chǎn)生什么結果,其實完全是由程序設計者所設計的代碼來決定——由每一行具體的程序代碼來指定在事件發(fā)生后,界面上的各個組件產(chǎn)生什么顯示結果,或者產(chǎn)生什么改變。 Java事件處理的機制是產(chǎn)生一個事件的對象必須設定其事件處理的監(jiān)聽者對象(Listener)。當事件發(fā)生時,監(jiān)聽者便會依據(jù)事件的類型來執(zhí)行相應的程序。 要處理一個對象所產(chǎn)生的事件,首先必須注冊該對象的監(jiān)聽者。Java.awt.event包中按照不同的事件類型定義了11個監(jiān)聽器接口,每類事件都有對應的事件監(jiān)聽器,監(jiān)聽器實際上就是接口,接口中定義了事件發(fā)生時可調用的、必須要實現(xiàn)的方法,一個類可實現(xiàn)監(jiān)聽器的一個或多個接口。與AWT事件有關的所有事件都是由java.awt.AWTEvent類派生而來的。 系統(tǒng)對事件進行了分類。每一種事件用一種系統(tǒng)定義好的系統(tǒng)類來表示。不同的組件會對應產(chǎn)生不同的事件,也就對應到不同的事件類。而每一種事件類,又對應要實現(xiàn)(implements)不同的接口。而每一個接口中,又有一個或者多個方法必須要被實現(xiàn)(這也是接口被implements時的語法要求),這些方法中的代碼,就是對應的事件的具體的處理代碼。 常見的AWT事件以及與其關聯(lián)的組件如下表所示,Swing也是類似的。 另外,由于監(jiān)聽器實際上就是實現(xiàn)了相應接口的類,而接口一般要求實現(xiàn)許多方法,如接口WindowListener中有7個方法,并不是所有方法都是需要的,但接口卻要求實現(xiàn)其所有的方法。為了簡化,java語言為一些接口統(tǒng)一提供了事件適配器(Adapter)。事件適配器是抽象類。通過繼承事件適配器,重寫需要的方法,不要的方法可以不寫。例如Java.awt.event包中提供了以下幾個事件適配器: ComponentAdapter——組件適配器,ContainerAdapter——容器適配器,F(xiàn)ocusAdapter——焦點適配器, KeyAdapter——鍵盤適配器,MouseAdapter——鼠標適配器,MouseMotionAdapter——鼠標移動適配器, WindowAdapter——窗口適配器。 表4-1 常見的AWT事件及其關聯(lián)組件、接口、方法 事件類 可關聯(lián)的組件 要實現(xiàn)的接口 接口中必須實現(xiàn)的方法 ActionEvent Button,List, MenuItem,TextField ActionListener ActionPerformed(Actionevent e) ItemEvent Checkbox,Choice, List,MenuItem ItemListener ItemStateChanged(ItemEvent e ContainerEvent Container,Dialog, Frame,Panel, ScrollPane,Window ContainerListener componentAdded(ContainerEvent e) componentRemoved(…) MouseMotionEvent Button,Canvas,Checkbox,choice,Component,Container,Dialog, Frame,Label,List, Panel,Scrollbar, ScrollPane,TextArea, TextField,Window MouseMotionListener mouseGragged(MouseEvent e) mouseMoved(MouseEvent e) MouseEvent 同MouseMontionEvent MouseListener mousePressed(MouseEvent e) mouseReleased(…) mouseEntered(…) mouseExited(…) mouseClicked(…) KeyEvent 同MouseMontionEvent KeyEvent keyPressed(KeyEvent e) keyReleased(…) keyTyped() FocusEvent 同MouseMontionEvent FocusListener focusGained(FocusEvent e) focusLost(FocusEvent e) AdjustmentEvent Scrollbar AdjustmentListener adjustmentValueChanged(AdjustmentEvent e) ComponentEvent 同MouseMontionEvent ComponentListener ComponentMoved(ComponentEvent e) ComponentHidden(…) ComponentResized(…) ComponentShown(…) TextEvent TextField,TextArea TextListener textValueChanged(TextEvent e) WindowEvent Dialog,Frame,Window WindowListener WindowClosing(WindowEvent e) WindowOpened(…) WindowIconified(…) WindowClosed(…) WindowDeiconfied(…) WindowActivated(…) WindowDeactivated(…) 總結一下,圖形界面程序設計中的事件處理的步驟是:首先要讓可能產(chǎn)生事件的組件對事件進行監(jiān)聽,那么就要實現(xiàn)監(jiān)聽器接口,實現(xiàn)(implements)了接口的話,就必須要實現(xiàn)接口中所有的方法(這些方法就是具體進行事件處理的代碼)。每個組件的事件處理,在程序代碼設計上都是要處理這三點。下面我們以例子程序來進行演示和體會。 import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextField; //解決實驗題目中,判斷字符串為空的幾種方法 public class EmptyTest implements ActionListener{ JFrame jFrame=new JFrame("JFrame"); JTextF- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- java 圖形界面 程序設計 補充 講稿
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.appdesigncorp.com/p-9634838.html