JAVA程序語言系列講座-GUI.ppt_第1頁
JAVA程序語言系列講座-GUI.ppt_第2頁
JAVA程序語言系列講座-GUI.ppt_第3頁
JAVA程序語言系列講座-GUI.ppt_第4頁
JAVA程序語言系列講座-GUI.ppt_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Java程序設(shè)計(jì)系列講座4GUI程序設(shè)計(jì),黃紹輝 廈門大學(xué)計(jì)算機(jī)科學(xué)系 E-mail: ,先學(xué)習(xí)純界面制作,Swing vs. AWT,AWT是Swing的基礎(chǔ)。AWT設(shè)計(jì)的初衷是支持開發(fā)小應(yīng)用程序的簡單用戶界面。但是AWT存在著嚴(yán)重的缺陷,并且缺少剪貼板、打印支持、鍵盤導(dǎo)航等特性。 Swing是由100%純Java實(shí)現(xiàn)的,是用Java實(shí)現(xiàn)的輕量級(light-weight)組件,沒有本地代碼,不依賴操作系統(tǒng)的支持,這是它與AWT組件的最大區(qū)別。 Swing采用了一種MVC的設(shè)計(jì)范式,即“模型-視圖-控制”(Model-View-Controller),其中模型用來保存內(nèi)容,視圖用來顯示內(nèi)容,

2、控制器用來控制用戶輸入。 Swing外觀感覺采用可插入的外觀感覺(Pluggable Look and Feel,PL / Create a label with text Enter your name: JLabel jlblName = new JLabel(Enter your name: ); / Create a text field with text Type Name Here JTextField jtfName = new JTextField(Type Name Here); / Create a check box with text bold JCheckBox j

3、chkBold = new JCheckBox(Bold); / Create a radio button with text red JRadioButton jrbRed = new JRadioButton(Red); / Create a combo box with choices red, green, and blue JComboBox jcboColor = new JComboBox(new StringRed, Green, Blue);,GUI組件都是從JComponent派生出來的,測試一下JButton的繼承路線,下面代碼取值都是true,從中可以看出JButto

4、n是怎么來的: JButton jbtOK = new JButton(OK); System.out.println(jbtOK instanceof JButton); System.out.println(jbtOK instanceof AbstractButton); System.out.println(jbtOK instanceof JComponent); System.out.println(jbtOK instanceof Container); System.out.println(jbtOK instanceof Component); System.out.prin

5、tln(jbtOK instanceof Object);,容器類,這里只研究SWING的容器 JFrame:窗口程序的容器 JDialog:對話框容器 JApplet:小應(yīng)用程序容器 JPanel:中間容器,可用于放置組件和繪圖,GUI輔助類,Graphics:繪圖類 Color:顏色類 Font:字體類 FontMetrics:字體屬性類 Dimension:維數(shù)類,包含寬和高兩個屬性 LayoutManager:布局管理類,用來管理組件的放置方式,主框架,JFrame是一個頂層容器,因此可以用作程序的主框架。但是一般不直接使用JFrame,而是用它的派生類創(chuàng)建主框架。 作為頂層容器,JF

6、rame本身可以看作是一個面板,叫根面板。同時根面板又包含好幾個子面板,用來實(shí)現(xiàn)不同的功能。 在面板可以進(jìn)行的操作包括:貼組件和繪圖。,根面板,根面板由一個玻璃面板(glassPane)、一個內(nèi)容面板(contentPane)和一個可選擇的菜單條(JMenuBar)組成,而內(nèi)容面板和可選擇的菜單條放在同一分層面板(LayeredPane)。 玻璃面板是完全透明的,缺省值為不可見,為接收鼠標(biāo)事件和在所有組件上繪圖提供方便。,GUI程序的框架示例1,import javax.swing.*; class MyGUI extends JFrame /注意這個MyGUI類,除了繼承,啥都沒干,可是人家

7、就是有界面 public class Test public static void main(String args) MyGUI frame = new MyGUI(); frame.setTitle(早上好!); frame.setSize(500, 400); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ,Swing組件的添加,Swing組件不能直接添加到頂層容器中,它必須添加到一個與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(content pane)上。 對JFrame添加組件有

8、兩種方式:1) 直接貼在內(nèi)容面板上: add(someComponent)2) 建立一個JPanel之類的中間容器,把組件添加到JPanel容器中,然后把JPanel貼上去:JPanel panel=new JPanel( );/把其它組件添加到JPanel中;add(panel);,GUI程序的框架示例2,import javax.swing.*; import java.awt.*; class MyGUI extends JFrame private JButton button = new JButton(“一個按鈕”); /做一個按鈕,作成員變量 public MyGUI() /一般

9、在構(gòu)造函數(shù)做界面 setLayout (new FlowLayout(FlowLayout.LEFT); /設(shè)置布局,后面再談 add(new JLabel(“一個標(biāo)簽”); /貼一個匿名的標(biāo)簽 add(button); /貼一個按鈕 JTextField input = new JTextField(“一個輸入框”); /做一個輸入框 add(input); /貼一個輸入框 public class Test public static void main(String args) MyGUI frame = new MyGUI(); frame.setTitle(早上好!); frame.

10、setSize(300, 100); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ,布局管理器,布局管理器用來決定添加到內(nèi)容面板上的組件如何排列。Java的布局有一個特點(diǎn),可以根據(jù)窗口的大小不同,自動縮放或者移動組件,從而達(dá)到比較好的視覺效果。 C+的布局一般采用的是硬編碼(hard-coded),就是組件必須定位定尺寸放置,即使窗口大小改變,組件仍然不動。 為照顧C(jī)+程序員的習(xí)慣,Java也支持硬編碼,但是不提倡。,流式布局,流式布局是最簡單的布局,默認(rèn)情況下,按照add進(jìn)去的順序

11、,所有組件從左到右,從上到下放置。如果一行放不下,就自動換行。 你可以指定組件放置的水平間距hgap和垂直間距vgap。,import javax.swing.*; import java.awt.*; public class ShowFlowLayout extends JFrame public ShowFlowLayout() setLayout (new FlowLayout(FlowLayout.LEFT); add(new JLabel(First Name); add(new JTextField(8); add(new JLabel(MI); add(new JTextFie

12、ld(1); add(new JLabel(Last Name); add(new JTextField(8); public static void main(String args) ShowFlowLayout frame = new ShowFlowLayout(); frame.setTitle(ShowFlowLayout); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 300); frame.setVisible(true); ,做GUI的三大步驟,從頂層容器(例如JFrame)

13、繼承一個新類。不直接使用頂層容器,是因?yàn)椴环奖銛U(kuò)充功能。 public class ShowFlowLayout extends JFrame 設(shè)置布局方式 setLayout (new FlowLayout(FlowLayout.LEFT); 添加組件 add(new JLabel(First Name);,網(wǎng)格布局,網(wǎng)格布局是把面板平均分為m行n列的小格子,每個組件占據(jù)一個格子。 當(dāng)面板大小改變時,組件大小隨之改變,但是始終在同一個格子中。,import javax.swing.*;import java.awt.*;public class ShowGridLayout extends

14、JFrame public ShowGridLayout() setLayout(new GridLayout(3, 2); add(new JLabel(First Name); add(new JTextField(8); add(new JLabel(MI); add(new JTextField(1); add(new JLabel(Last Name); add(new JTextField(8); public static void main(String args) ShowGridLayout frame = new ShowGridLayout(); frame.setTi

15、tle(ShowGridLayout); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 125); frame.setVisible(true); ,地圖布局,地圖布局將面板分成東西南北中五個區(qū)域,組件可以被放置在任何一個區(qū)域。 記住雖然有五個區(qū)域可以放置組件,但是Java沒有讓你一定要放滿每一個區(qū)域,全部放空都無所謂的。,import javax.swing.*; import java.awt.*; public class ShowBorderLayout extends JFrame p

16、ublic ShowBorderLayout() setLayout(new BorderLayout(); add(new JButton(East), BorderLayout.EAST); add(new JButton(South), BorderLayout.SOUTH); add(new JButton(West), BorderLayout.WEST); add(new JButton(North), BorderLayout.NORTH); add(new JButton(Center), BorderLayout.CENTER); public static void mai

17、n(String args) ShowBorderLayout frame = new ShowBorderLayout(); frame.setTitle(ShowBorderLayout); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 200); frame.setVisible(true); ,使用中間容器1,對于復(fù)雜的界面,往往不能用一種布局來完成。這種時候,就需要借助中間容器JPanel來完成。 換言之,我們可以先把界面劃分成小塊,用JPanel占位置。然后,再把組件往JPanel上

18、貼。這樣就形成了大布局套小布局的復(fù)雜界面。,使用中間容器2,我們來分析做這個界面的思路: 首先這個界面可以分成左右兩個大塊。顯然不能用流式布局,否則右邊一半可能會被擠下去;于是可以選擇地圖布局,左邊放在CENTER,右邊放在EAST; 右邊一半太復(fù)雜,所以先用一個JPanel占位置,不妨叫它p2。p2適合被分為上下兩半,所以還是用地圖布局,上面一半放NORTH,下面一半放CENTER; 右下這里還是復(fù)雜,先用JPanel占位置,不妨叫它p1。p1上有12個按鈕,為了不讓按鈕跑來跑去,而且最好一樣大,顯然是網(wǎng)格布局最好。 至此界面設(shè)計(jì)完畢,編碼的時候,按步驟3,2,1倒寫回去即可。,關(guān)鍵代碼1,

19、/ 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);,關(guān)鍵代碼2,/ Create panel p2 to

20、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);,事件驅(qū)動編

21、程,事件和事件源,Java采用事件驅(qū)動模型來處理用戶界面。它隨時在監(jiān)聽用戶的操作,當(dāng)用戶在界面上有所動靜(例如動鼠標(biāo)、敲鍵盤),都會被Java記錄下來。 如果你想處理用戶的某種行為(例如單擊按鈕),你可以讓Java在特定行為發(fā)生后告訴你,然后轉(zhuǎn)入你給Java的處理函數(shù),這個叫事件觸發(fā)。,Java的事件類,為了描述事件的細(xì)節(jié),Java定義了事件類。,事件源和事件類型,一種組件可以觸發(fā)多種事件 同一種事件也可能有多種組件可以觸發(fā),這種時候Java必須通過事件類的getSource函數(shù)才能知道是誰干的。,監(jiān)聽、注冊和事件處理,Java采用代表模型(delegation-based model )來處

22、理事件。流程是這樣的:首先,有一個組件來觸發(fā)事件,然后,如果有人對這個事件感興趣,就抓去處理。 為了表達(dá)你對什么組件的什么事件感興趣,你要先創(chuàng)建一個監(jiān)聽器(listener),然后把這個監(jiān)聽器注冊(addXXXListener)到組件上。這樣在特定事件發(fā)生后,你才有資格處理。 簡單說,第一步用監(jiān)聽器來選擇事件類型,第二步的注冊則是用來選擇組件。兩步都不能少。,事件處理兩步驟:1做監(jiān)聽器 2加注冊,監(jiān)聽器其實(shí)是一個類,但是它必須實(shí)現(xiàn)了對應(yīng)的監(jiān)聽接口(顯然不同事件的接口不同)。 當(dāng)然,監(jiān)聽器還要被注冊到相應(yīng)的組件上。,1. 監(jiān)聽器,實(shí)現(xiàn)了特定接口的類,都可以作為監(jiān)聽器。 不同的事件對應(yīng)不同的接口。

23、 接口定義的每一個函數(shù)都需要覆蓋。,2. 注冊,監(jiān)聽器做好以后,就可以用來監(jiān)聽相應(yīng)的事件。接下來是選擇一個你感興趣的組件,然后把這個監(jiān)聽器注冊(addXXXListener)到組件上。 例如注冊按鈕的點(diǎn)擊事件,對應(yīng)的監(jiān)聽接口是ActionEvent,所以用addActionListener注冊,做一個按鈕的監(jiān)聽來鞏固一下,import javax.swing.*; import java.awt.event.*; import java.awt.*; class OKListener implements ActionListener /注意這是個監(jiān)聽器,因?yàn)樗鼘?shí)現(xiàn)了ActionListene

24、r public void actionPerformed(ActionEvent e) /覆蓋監(jiān)聽器定義的函數(shù),函數(shù)原型不能改動 System.out.println(點(diǎn)到了!點(diǎn)到了!); /事件處理函數(shù),這里隨便寫寫 public class SimpleEventDemo extends JFrame public SimpleEventDemo() setLayout(new FlowLayout(); JButton jbtOK = new JButton(OK); add(jbtOK); ActionListener listener = new OKListener(); jbt

25、OK.addActionListener(listener); /把監(jiān)聽器注冊到組件上 public static void main(String args) SimpleEventDemo frame = new SimpleEventDemo(); frame.setTitle(SimpleEventDemo); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(220, 80); frame.setVisible(true); ,ActionEvent,ActionEvent有幾個有用的函數(shù),其中一個

26、叫做getSource()。這個函數(shù)用來判斷觸發(fā)的事件源,當(dāng)多個組件能夠觸發(fā)同一事件時,它的用處就大了。 例如上面的例子,如果有兩個按鈕,都被注冊了監(jiān)聽,那只能靠getSource()才能知道是哪個被點(diǎn)下去了。,談?wù)剝?nèi)部類,當(dāng)一個類被另外一個類完整包含時,里面那個類就是內(nèi)部類。 由于內(nèi)部類能夠方便訪問到外部類的成員,所以被廣泛用作監(jiān)聽器。,內(nèi)部類作為監(jiān)聽器,import javax.swing.*; import java.awt.event.*; import java.awt.*; public class SimpleEventDemo extends JFrame class OKLi

27、stener implements ActionListener /注意這是個監(jiān)聽器,因?yàn)樗鼘?shí)現(xiàn)了ActionListener public void actionPerformed(ActionEvent e) /覆蓋監(jiān)聽器定義的函數(shù),函數(shù)原型不能改動 System.out.println(點(diǎn)到了+e.getActionCommand() ); /事件處理函數(shù),這里隨便寫寫 public SimpleEventDemo() setLayout(new FlowLayout(); JButton jbtOK1 = new JButton(按鈕一); JButton jbtOK2 = new J

28、Button(按鈕二); add(jbtOK1);add(jbtOK2); ActionListener listener = new OKListener(); jbtOK1.addActionListener(listener); jbtOK2.addActionListener(listener); /把監(jiān)聽器注冊到組件上 public static void main(String args) SimpleEventDemo frame = new SimpleEventDemo(); frame.setTitle(SimpleEventDemo); frame.setDefaultC

29、loseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(220, 80); frame.setVisible(true); ,注意這里,OKListener是個標(biāo)準(zhǔn)的內(nèi)部類。,匿名內(nèi)部類,其實(shí)上面那個例子當(dāng)中,類的名字并不重要,所以可以做成匿名內(nèi)部類。 實(shí)際上,Java的內(nèi)部類,用得最多的地方就是在事件處理中。而在事件處理中,用得最多的就是匿名內(nèi)部類。 看一個匿名內(nèi)部類的例子。,import javax.swing.*;import java.awt.event.*;import java.awt.*;public class SimpleEven

30、tDemo extends JFrame public SimpleEventDemo() setLayout(new FlowLayout(); JButton jbtOK = new JButton(OK); add(jbtOK); jbtOK.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.out.println(e.getSource(); ); /把監(jiān)聽器注冊到組件上 public static void main(String args) SimpleE

31、ventDemo frame = new SimpleEventDemo(); frame.setTitle(SimpleEventDemo); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(220, 80); frame.setVisible(true); ,匿名內(nèi)部類,注意這里,藍(lán)色部分就是匿名內(nèi)部類。它是一個完整的類,并實(shí)現(xiàn)了監(jiān)聽接口,所以可以作為監(jiān)聽器。 整個類作為addActionListener函數(shù)的參數(shù)雖然看上去夸張了一點(diǎn),事實(shí)上在Java的代碼中卻很常見。,總結(jié)一下,Java事件處理模型有

32、兩個步驟:1. 做監(jiān)聽器;2. 注冊監(jiān)聽器到組件上。 只要實(shí)現(xiàn)了監(jiān)聽接口的類,都可以作為監(jiān)聽器。監(jiān)聽器最常用的有兩種方式的做法:1. 匿名內(nèi)部類作為監(jiān)聽器;2. 擁有組件的類本身作為監(jiān)聽器。 之所以這兩種做法流傳甚廣,是因?yàn)檫@兩種做法都能夠比較方便地訪問到類的成員變量。 看兩個例子。,import javax.swing.*;import java.awt.*;import java.awt.event.*;public class TestActionEvent extends JFrame private JLabel jlblText = new JLabel(0); private J

33、Button jbtAdd = new JButton(+); private JButton jbtSub = new JButton(-); int count = 0; public TestActionEvent() setLayout(new FlowLayout(); add(jlblText); add(jbtAdd); add(jbtSub); jbtAdd.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) jlblText.setText(+ (+count);

34、); jbtSub.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) jlblText.setText(+ (-count); ); public static void main(String args) TestActionEvent frame = new TestActionEvent(); frame.setTitle(TestActionEvent); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame

35、.setSize(220, 80); frame.setVisible(true); ,匿名內(nèi)部類做監(jiān)聽器,import javax.swing.*;import java.awt.*;import java.awt.event.*;public class TestActionEvent extends JFrame implements ActionListener /自己作為監(jiān)聽器也是可以的 private JLabel jlblText = new JLabel(0); private JButton jbtAdd = new JButton(+); private JButton j

36、btSub = new JButton(-); int count = 0; public TestActionEvent() setLayout(new FlowLayout(); add(jlblText); add(jbtAdd); add(jbtSub); jbtAdd.addActionListener(this);/注冊到自己 jbtSub.addActionListener(this);/注冊到自己 public void actionPerformed(ActionEvent e) if (e.getSource() = jbtAdd) jlblText.setText(+ (

37、+count); else if (e.getSource() = jbtSub) jlblText.setText(+ (-count); else jlblText.setText(Oh!My GOD!); public static void main(String args) TestActionEvent frame = new TestActionEvent(); frame.setTitle(TestActionEvent); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(220, 80);

38、 frame.setVisible(true); ,界面類自己做監(jiān)聽器,import java.awt.event.*;import javax.swing.JFrame;public class TestWindowEvent extends JFrame public static void main(String args) TestWindowEvent frame = new TestWindowEvent(); Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle(TestWindowEvent);

39、 frame.setSize(220, 80); frame.setVisible(true); public TestWindowEvent() addWindowListener(new WindowListener() public void windowDeiconified(WindowEvent event) System.out.println(Window deiconified); public void windowIconified(WindowEvent event) System.out.println(Window iconified); public void w

40、indowActivated(WindowEvent event) System.out.println(Window activated); public void windowDeactivated(WindowEvent event) System.out.println(Window deactivated); public void windowOpened(WindowEvent event) System.out.println(Window opened); public void windowClosing(WindowEvent event) System.out.prin

41、tln(Window closing); public void windowClosed(WindowEvent event) System.out.println(Window closed); ); ,窗口事件的例子,藍(lán)色部分是窗口事件的監(jiān)聽接口,可以看到預(yù)先定義的函數(shù)實(shí)在太多,一個一個覆蓋過去實(shí)在麻煩。所以一般人不會去監(jiān)聽窗口。,接口適配器,上例可以看到,遇到復(fù)雜一點(diǎn)的接口實(shí)在是很郁悶。例如,你依然想監(jiān)聽窗口事件,希望當(dāng)用戶關(guān)閉窗口后,跟用戶bye一下。 顯然,bye只要寫在windowClosed函數(shù)里就可以了??墒悄闳匀徊坏貌话衙恳粋€窗口的監(jiān)聽函數(shù)寫一遍,只不過其它的函數(shù)體都是空的

42、而已。 接口適配器是這樣一種東西,它可以允許你只覆蓋你想要的監(jiān)聽函數(shù),其它的函數(shù)你就不用寫了。所以,每一種比較復(fù)雜的監(jiān)聽接口,都有一個簡化版的寫法,那就是接口適配器。,適配器和對應(yīng)的監(jiān)聽接口,用適配器實(shí)現(xiàn)關(guān)閉窗口道別的功能,import java.awt.event.*; import javax.swing.JFrame; public class TestWindowEvent extends JFrame public static void main(String args) TestWindowEvent frame = new TestWindowEvent(); Frame.se

43、tDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle(TestWindowEvent); frame.setSize(220, 80); frame.setVisible(true); public TestWindowEvent() addWindowListener(new WindowAdapter() public void windowClosed(WindowEvent event) System.out.println(bye.); ); ,藍(lán)色部分就是用適配器的地方,可以看到去除了無關(guān)的窗口事件之后,這個世界清

44、靜了好多。,鼠標(biāo)事件1,鼠標(biāo)事件由MouseEvent類描述。常見的鼠標(biāo)操作有按下,松開,點(diǎn)擊,移動和拖動。,鼠標(biāo)事件2,鼠標(biāo)事件的監(jiān)聽有兩類接口,MouseListener和MouseMotionListener。前者用來監(jiān)聽按下、松開、點(diǎn)擊、進(jìn)入和移出;后者用來監(jiān)聽拖動和移動。,監(jiān)聽鼠標(biāo)移動的例子,1 import java.awt.*; 2 import java.awt.event.*; 3 import javax.swing.*; 4 5 public class MoveMessageDemo extends JFrame 6 public MoveMessageDemo() 7

45、 / Create a MovableMessagePanel instance for moving a message 8 MovableMessagePanel p = new MovableMessagePanel(Welcome to Java); 9 10 / Place the message panel in the frame 11 getContentPane().setLayout(new BorderLayout(); 12 getContentPane().add(p); 13 14 15 /* Main method */ 16 public static void

46、 main(String args) 17 MoveMessageDemo frame = new MoveMessageDemo(); 18 frame.setTitle(MoveMessageDemo); 19 frame.setLocationRelativeTo(null); / Center the frame 20 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 frame.setSize(200, 100); 22 frame.setVisible(true); 23 ,監(jiān)聽鼠標(biāo)移動的例子(續(xù)),25 / Inne

47、r class: MovableMessagePanel draws a message 26 static class MovableMessagePanel extends Jpanel 27 private String message = Welcome to Java; 28 private int x = 20; 29 private int y = 20; 30 31 /* Construct a panel to draw string s */ 32 public MovableMessagePanel(String s) 33 message = s; 34 addMous

48、eMotionListener(new MouseMotionAdapter() 35 /* Handle mouse dragged event */ 36 public void mouseDragged(MouseEvent e) 37 / Get the new location and repaint the screen 38 x = e.getX(); 39 y = e.getY(); 40 repaint(); 41 42 ); 43 44 45 /* Paint the component */ 46 protected void paintComponent(Graphic

49、s g) 47 super.paintComponent(g); 48 g.drawString(message, x, y); 49 50 51 ,鼠標(biāo)畫圖的例子,import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ScribbleDemo extends JFrame public ScribbleDemo() add(new ScribblePanel(), BorderLayout.CENTER); /* Main method */ public static void main

50、(String args) ScribbleDemo frame = new ScribbleDemo(); frame.setTitle(ScribbleDemo); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 188); frame.setVisible(true); ,鼠標(biāo)畫圖的例子(續(xù)),class ScribblePanel extends JPanel final int CIRCLESIZE = 20; private Point lineStart = new Point(0,

51、 0); / Line start point public ScribblePanel() addMouseListener( new MouseAdapter() public void mousePressed(MouseEvent e) lineStart.move(e.getX(), e.getY(); ); addMouseMotionListener( new MouseMotionAdapter() public void mouseDragged(MouseEvent e) Graphics g = getGraphics(); if (e.isMetaDown() g.se

52、tColor(getBackground(); g.fillOval(e.getX() - (CIRCLESIZE / 2), e.getY() - (CIRCLESIZE / 2), CIRCLESIZE, CIRCLESIZE); else g.setColor(Color.black); g.drawLine(lineStart.x, lineStart.y, e.getX(), e.getY(); lineStart.move(e.getX(), e.getY(); g.dispose(); ); ,鍵盤事件1,鍵盤事件由KeyEvent描述,主要事件有按下和松開,以及輸入。 鍵盤事件

53、的監(jiān)聽器由KeyListener接口定義,鍵盤事件2,Java預(yù)定義了鍵盤上所有的按鍵的值,監(jiān)聽時返回的就是這些對應(yīng)值。 對于可顯示鍵,鍵值就是對應(yīng)的ASCII碼;對于功能鍵,對應(yīng)預(yù)定義的一些常量,右表是其中一部分。 可以選擇返回字符鍵值getKeyChar()或者整數(shù)getKeyCode()。,鍵盤事件的例子,import java.awt.*; import java.awt.event.*; import javax.swing.*; public class KeyboardEventDemo extends JFrame private KeyboardPanel keyboardP

54、anel = new KeyboardPanel(); public KeyboardEventDemo() getContentPane().add(keyboardPanel); keyboardPanel.setFocusable(true); public static void main(String args) KeyboardEventDemo frame = new KeyboardEventDemo(); frame.setTitle(KeyboardEventDemo); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE

55、); frame.setSize(300, 188); frame.setVisible(true); ,鍵盤事件的例子(續(xù)),class KeyboardPanel extends JPanel private int x = 100; private int y = 100; private char keyChar = A; public KeyboardPanel() addKeyListener( new KeyAdapter() public void keyPressed(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_DO

56、WN: y += 10; break; case KeyEvent.VK_UP: y -= 10; break; case KeyEvent.VK_LEFT: x -= 10; break; case KeyEvent.VK_RIGHT: x += 10; break; default: keyChar = e.getKeyChar(); repaint(); ); protected void paintComponent(Graphics g) super.paintComponent(g); g.setFont(new Font(TimesRoman, Font.PLAIN, 24);

57、g.drawString(String.valueOf(keyChar), x, y); ,定時器事件1,Java把定時器也設(shè)計(jì)成一種事件。當(dāng)時間到的時候,ActionEvent會被觸發(fā)。所以處理定時器跟處理按鈕點(diǎn)擊事件差不多。,定時器事件2,定時器的使用方法 準(zhǔn)備一個ActionEvent的監(jiān)聽器 創(chuàng)建定時器,并注冊到1中的監(jiān)聽器上; 啟動定時器。,定時器的例子1/2,import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MyTimer extends JFrame implements

58、ActionListener private JButton button = new JButton(“開始計(jì)數(shù)”); /創(chuàng)建按鈕 private Timer t = new Timer(10, this); /創(chuàng)建定時器,備用 private int count = 0; public MyTimer() add(button); /貼個按鈕 button.addActionListener(this); /加個監(jiān)聽 setSize(200, 120); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ,定時器的例子2/2,public void actionPerformed(ActionEvent event) if (event.getSource() = button) /按鈕觸發(fā)的事件 if (t.isRunning() /* 如果定時器正在運(yùn)行,停了它;否則就啟動它 */ t.stop(); else t.start(); if (event.getSource() = t) /定時器觸發(fā)的事件,計(jì)數(shù) button.setT

溫馨提示

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

評論

0/150

提交評論