亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java 圖形用戶界面設計(上)

2019-11-18 13:02:49
字體:
來源:轉載
供稿:網友

  作為一個 java 程序員,從論壇上感受到使用 Java 開發程序的人越來多,心中不免欣慰。但是,同樣是從論壇中,看到多數人提到 Java 就以為是網絡開發——不是這樣的,Java 也可以開發應用程序,而且可以開發出漂亮的圖形用戶界面的應用程序,也就是 Windows/XWindow 應用程序。因此,我寫下這篇文章,希望能帶你進入Java 圖形用戶界面設計之門。
  一. AWT 和 SWING
  AWT 和 SWING 是 Java 設計 GUI 用戶界面的基礎。與 AWT 的重量級組件不同,Swing 中大部分是輕量級組件。正是這個原因,Swing 幾乎無所不能,不但有各式各樣先進的組件,而且更為美觀易用。所以一開始使用 AWT 的程序員很快就轉向使用 Swing 了。
  那為什么 AWT 組件沒有消亡呢?因為 Swing 是架構在 AWT 之上的,沒有 AWT 就沒有 Swing。所以程序員可以根據自己的習慣選擇使用 AWT 或者是 Swing。但是,最好不要二者混用——除開顯示風格不同不說,還很可能造成層次 (Z-Order) 錯亂,比如下例:
  /**
  * TestPanels.java
  * @author Fancy
  */
  import javax.swing.*;
  import java.awt.*;
  public class TestPanels extends JFrame {
  public TestPanels() {
  setDefaultCloSEOperation(EXIT_ON_CLOSE);
  JPanel panel = new JPanel();
  for (int i = 0; i < 2; i++) {
  panel.add(new JButton("Button 00" + i));
  }
  JTextArea textArea = new JTextArea(5, 15);
  textArea.setLineWrap(true);
  JScrollPane scrollPane = new JScrollPane(textArea);
  getContentPane().add(panel, BorderLayout.NORTH);
  getContentPane().add(scrollPane, BorderLayout.CENTER);
  pack();
  }
  public static void main(String[] args) {
  TestPanels tp = new TestPanels();
  tp.show();
  }
  }
  運行這個程序,并用鼠標拖動那個名為“cover”的子窗口,我們會發現一個非常有趣的現象,如圖:
   Java 圖形用戶界面設計(上)(圖一)
  顯然 cover 子窗口是在 controls 子窗口之上的,但是它只罩蓋住了 Swing Button,沒有罩蓋住 AWT Button。再看一會兒,你是不是有這樣一種感覺:Swing Button 是“畫”上去的,而 AWT Button 則是“貼”上去的。這就是二者混用造成層次錯亂的一個例子。
  Swing 組件有美觀、易用、組件量大等特點,也有缺點——使用 Swing 組件的程序通常會比使用 AWT 組件的程序運行更慢。但是大家都還是更喜歡用 Swing 組件,原因何在?因為隨著計算機硬件的升級,一點點速度已經不是問題。相反的,用戶更需要美觀的用戶界面,開發人員則更需要易用的開發組件。
  ——好,我這就來教你使用 Swing 組件開發圖形用戶界面的 Java 應用程序。
  二. 框架、監聽器和事件
  框架 (Frame) 是 Java 圖形用戶界面的基礎,它就是我們通常所說的窗口,是 Windows/XWindow 應用程序的典型特征。說到 Windows/XWindow,大家很輕易聯想到“事件 (Event) 驅動”。Java 的圖形用戶界面正是事件驅動的,并且由各種各樣的監聽器 (Listener) 負責捕捉各種事件。
  假如我們需要對某一個組件的某種事件進行捕捉和處理時,就需要為其添加監聽器。比如,我們要在一個窗口 (JFrame) 激活時改變它的標題,我們就需要為這個窗口 (JFrame 對象) 添加一個可以監聽到“激活窗口”這一事件的監聽器——WindowListener。
  怎么添加監聽器呢?這通常由組件類提供的一個 addXXXXXListener 的方法來完成。比如 JFrame 就提供有 addWindowListener 方法添加窗口監聽器 (WindowListener)。
  一個監聽器經常不只監聽一個事件,而是可以監聽相關的多個事件。比如 WindowListener 除了監聽窗口激活事件 (windowActivate) 之外,還可以監聽窗口關閉事件 (windowClosing) 等。那么這些事件怎么區分呢?就靠重載監聽器類 (Class) 的多個方法 (Method) 了,監聽器監聽到某個事件后,會自動調用相關的方法。我們只要重載這個方法,就可以處理相應的事件了。
  不妨先看一個例子:
  /**
  * TestFrame.java
  * @author Fancy
  */
  import javax.swing.*;
  import java.awt.event.*;
  public class TestFrame extends JFrame {
  PRivate int counter = 0;
  public TestFrame(){
  /* 使用匿名類添加一個窗口監聽器 */
  addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
  System.out.println("Exit when Closed event");
  System.exit(0); //退出應用程序
  }
  public void windowActivated(WindowEvent e){setTitle("Test Frame " + counter++); // 改變窗口標題
  }
  });
  setResizable(false); // 設置窗口為固定大小
  setSize(200, 150);
  }
  public static void main(String[] args) {
  TestFrame tf = new TestFrame();
  tf.show();
  }
  }
  這個例子中,我們設計了一個窗口類(public class TestFrame extends JFrame { ...),并且為這個窗口添加了一個窗口監聽器 (addWindowListener(new WindowAdapter() ...)。而我們添加的這個窗口監聽器主要監聽了兩個事件:窗口關閉 (public void windowClosing(WindowEvent e) ...) 和窗口激活 (public void windowActivated(WindowEvent e) ...)。在窗口關閉事件中我們退出了整個應用程序(System.exit(0);),而在窗口激活事件中,我們改變了窗口的標題 (setTitle("Test Frame " + counter++);)。最后,我們在 main 方法中顯示了這窗口類的一個實例,運行得到下圖所示的結果:
   Java 圖形用戶界面設計(上)(圖二)
  這個程序的運行結果就是一個什么東西都沒有加的框架,也就是一個空窗口。那么,你知道顯示一個窗口最主要的幾句代碼嗎?不知道沒關系,我來告訴你,顯示一個窗口只需要做三件事:生成實例(對象) -> 設置大小 -> 顯示,相應的,就是下面的三句代碼:
  JFrame frame = new JFrame("Frame's Title");
  frame.setSize(400, 300);
  frame.show();
  也許你會說:第一句的意思我清楚,第三句的意思我也明白,為什么一定要第二句呢?其實想想也就明白了,叫你畫一個沒法有大小的矩形你能畫出來嗎?不能。同樣,沒有大小的窗口,怎么顯示?所以我們需要用 setSize(int width, int height) 方法為其設置大小。我們還有另一種方法:用 JFrame 的 pack() 方法讓它自己適配一個大小。pack() 在多數時候是令人滿足的,但有時,它也會讓你哭笑不得——多試試就知道了。
  在 JFrame 中,我們使用 addWindowListener 方法加入一個監聽器 WindowListener (addWindowListener(new WindowAdapter() ...) 去監聽發生在 JFrame 上的窗口事件。WindowListener 是一個接口,在 java.awt.event 這個包中,但是上例中好象并沒有使用 WindowListener,而是使用的 WindowsAdapter 吧,這是怎么回事?
  WindowAdapter 是 WindowsListener 接口的一個最簡單的實現,也在包 java.awt.event 中。假如我們直接使用 WindowListener 產生一個匿名類,需要實現它的每一個方法 (一共 7 個)。但 WindowAdapter 作為 WindowListener 最簡單的實現,已經實現了它的每一個方法為空方法 (即只包含空語句,或者說沒有語句的方法)。用 WindowAdapter 就只需要重載可能用到的方法 (上例中只有 2 個) 就行了,而不需要再去實現每一個方法。優點顯而易見——減少代碼量。
  在 JFrame 上發生的窗口事件 (WindowEvent) 包括:
  windowActivated(WindowEvent e) 窗口得到焦點時觸發
  windowClosed(WindowEvent e) 窗口關閉之后觸發
  windowClosing(WindowEvent e) 窗口關閉時觸發
  windowDeactivated(WindowEvent e) 窗口失去焦點時觸發
  windowDeiconified(WindowEvent e) 
  windowIconified(WindowEvent e) 
  windowOpened(WindowEvent e) 窗口打開之后觸發
  上例重載了其中兩個方法。假如在上例運行產生的窗口和另外一個應用程序窗口之間往返切換 (在 Windows 操作系統中你可以使用 Alt+Tab 進行切換)……試試看,你發現了什么?有沒有現我們的示例窗口標題上的數字一直在增加,這便是在 windowActivated 事件中 setTitle("Test Frame " + counter++); 的功勞。
  而另一個事件處理函數 windowClosing 中的 System.exit(0) 則保證了當窗口被關閉時退出當前的 Java 應用程序。假如不作這樣的處理會怎樣呢?試驗之后你會發現,窗口雖然關閉了,但程序并沒有結束,但此時,除了使用 ^C 強行結束之外,恐怕也沒有其它辦法了。所以,這一點非常重要:假如你想在關閉窗口的時候退出應用程序,需要你自己寫代碼處理 windowClosing 事件?!膊槐M然,其實還有另外一個更簡單的辦法,讓 JFrame 自己處理這件事——你只需要如下調用 JFrame 的 setDefaultCloseOperation 即可: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  我們可以在 JFrame 對象中添加 AWT 或者 Swing 組件。但是,雖然它有 add 方法,卻不能直接用于添加組件,否則會拋出異?!恍啪驮囋?。造成這個現象的原因只有一個解釋:JFrame 不是一個容器,它只是一個框架。那么,應該怎么添加組件呢?
  JFrame 有一個 Content Pane,窗口是顯示的所有組件都是添加在這個 Content Pane 中。JFrame 提供了兩個方法:getContentPane 和 setContentPane 就是用于獲取和設置其 Content Pane 的。通常我們不需要重新設置 JFrame 的 Content Pane,只需要直接獲取

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文欧美在线视频| 2019国产精品自在线拍国产不卡| 久久精品国产91精品亚洲| 91国产精品91| 精品久久久香蕉免费精品视频| 国产一区二区三区精品久久久| 91精品久久久久久久久久久久久久| 亚洲女人天堂视频| 亚洲韩国欧洲国产日产av| 日韩精品久久久久| 欧美性xxxx在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 国产一区玩具在线观看| 亚洲网站在线观看| 久久人人爽亚洲精品天堂| 亚洲欧美日韩爽爽影院| 国产精品极品美女在线观看免费| 欧美成人精品在线播放| 色噜噜国产精品视频一区二区| 欧美日韩aaaa| 福利一区视频在线观看| 成人激情综合网| 久久国产精品99国产精| 亚洲激情视频在线播放| 一区二区三区视频观看| 欧美福利小视频| 精品成人69xx.xyz| 欧美极品美女电影一区| 日韩黄色av网站| 久久av.com| 色偷偷888欧美精品久久久| 国产视频在线一区二区| 日韩精品极品毛片系列视频| 91精品国产91久久久久久最新| 国产精品久久久久久久久久久久久| 亚洲午夜女主播在线直播| 国产欧美精品一区二区三区介绍| 亚洲精品网址在线观看| 欧美日韩加勒比精品一区| 粉嫩av一区二区三区免费野| 亚洲图片欧美日产| 91精品视频播放| 亚洲美女在线看| 最近免费中文字幕视频2019| 成人激情综合网| 日韩欧美精品中文字幕| 亚洲成av人片在线观看香蕉| 欧美亚洲国产视频| 国产亚洲在线播放| 欧美专区福利在线| 国产精品久久久久一区二区| 8090理伦午夜在线电影| 色老头一区二区三区| 日韩va亚洲va欧洲va国产| 久久九九亚洲综合| 91亚洲精品久久久| 日韩中文字幕在线播放| 中文字幕一精品亚洲无线一区| 欧美二区乱c黑人| 91九色视频在线| 亚洲人成自拍网站| 欧美中文字幕在线| 欧美日韩免费区域视频在线观看| 国产成人拍精品视频午夜网站| 国产精品流白浆视频| 国产精品久久网| 色综合伊人色综合网| 日韩欧美国产成人| 国产欧美亚洲精品| 欧美另类极品videosbest最新版本| 亚洲最新av在线| 亚洲小视频在线| 亚洲桃花岛网站| 国产亚洲人成a一在线v站| 日韩中文字幕在线看| 91精品国产精品| 亚洲免费福利视频| 亚洲网站视频福利| 久久久久国产精品www| 成人av资源在线播放| 欧美丝袜美女中出在线| 亚洲色图日韩av| 欧美大秀在线观看| 精品久久久久久久久久久久久| 欧美日韩999| 亚洲免费中文字幕| 久久久久久网站| 亚洲欧美国产精品久久久久久久| 国产精品视频导航| 国产精品www网站| 亚洲国产精品久久| 亚洲午夜未满十八勿入免费观看全集| 亚洲区中文字幕| 91精品国产综合久久久久久久久| 国产精品一区二区在线| 国产精品久久久av久久久| 国产欧美婷婷中文| 亚洲成色999久久网站| 欧美裸体xxxx极品少妇软件| 亚洲最大在线视频| 国产欧美日韩专区发布| 亚洲综合日韩中文字幕v在线| 亚洲xxxxx性| 精品电影在线观看| 国产精品日韩在线观看| 欧美精品在线观看| 日韩在线观看你懂的| 日本一欧美一欧美一亚洲视频| 久久久久久高潮国产精品视| 久久伊人精品天天| 国产这里只有精品| 亚洲免费视频在线观看| 国产精品高清在线| 亚洲男人天堂视频| 欧美激情在线播放| 欧美亚洲视频一区二区| 亚洲国产欧美一区二区三区同亚洲| 亚洲精品福利资源站| 国产伦精品免费视频| 在线a欧美视频| 亚洲精品美女在线| 国产精品wwwwww| 日韩美女视频免费在线观看| 久久久久久免费精品| 国产区亚洲区欧美区| 97视频色精品| 国产拍精品一二三| 欧美国产日韩一区二区| 国产在线视频不卡| 日韩中文有码在线视频| 亚洲大尺度美女在线| 九九热在线精品视频| 岛国av午夜精品| 欧美成人午夜剧场免费观看| 最近2019中文字幕大全第二页| 国产精品白嫩初高中害羞小美女| 国产欧美一区二区三区视频| 国产日韩在线看片| 亚洲欧美国产精品久久久久久久| 俺去了亚洲欧美日韩| 麻豆一区二区在线观看| 国产精品网红直播| 97涩涩爰在线观看亚洲| 91av在线播放视频| 国产精品香蕉av| 色偷偷偷综合中文字幕;dd| 97精品久久久| 91美女高潮出水| 日韩在线视频导航| 亚洲精品成人免费| 一区国产精品视频| 久久免费视频网站| 国产精品嫩草影院一区二区| 欧美一区二区三区四区在线| 日韩黄色在线免费观看| 亚洲影院色在线观看免费| 2019中文字幕全在线观看| 久久久久久久久久久免费| 最近2019免费中文字幕视频三| 日韩高清有码在线| 亚洲黄一区二区| 欧美成人午夜视频| 热re99久久精品国产66热| 久久成人国产精品|