<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java學習

    java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經搬家了,新的地址是 http://www.javaly.cn 如果有對文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會盡力幫助解決。一起進步

     

    swing入門教程

    swing簡介(2009-04-20 23:52:40)

    (轉自http://terrificwanjun.bokee.com/)

    UI 組件簡介

    在開始學習 Swing 之前,必須回答針對真正初學者的一個問題:什么是 UI?初學者的答案是用戶界面。但是因為本教程的目標是要保證您不再只是個初學者,所以我們需要比這個定義更高級的定義。

    所以,我再次提出這個問題:什么是 UI?您可能把它定義成您按下的按鈕、打字的地址欄 、打開和關閉的窗口,等等,這些都是 UI 的元素,但是除了在屏幕上看到的這些之外,還有更多都是 UI 元素。比如鼠標、鍵盤、音量、屏幕顏色、使用的字體,以及一個對象相對于另一個對象的位置,這些都包含在 UI 之中。實際上,在計算機和用戶的交互之中扮演角色的任何對象都是 UI 的組成部分。這看起來足夠簡單,但是您應當驚訝的是,有許多人和大型公司已經為它努力了很多年。實際上,現在有的大學專業的惟一課程就是研究這種交互。

    Swing 的角色

    Swing 是 Java 平臺的 UI —— 它充當處理用戶和計算機之間全部交互的軟件。它實際上充當用戶和計算機內部之間的中間人。Swing 到底是如何做這項工作的呢?它提供了處理前面一節中描述的 UI 各方面內容的機制:

    • 鍵盤:Swing 提供了捕捉用戶輸入的方法。
    • 顏色:Swing 提供改變在屏幕上看到的顏色的方法。
    • 打字的地址欄:Swing 提供了文本組件,處理所有普通任務。
    • 音量:Swing 不太擅長。

    無論如何,Swing 為您提供了創建自己的 UI 所需要的所有工具

     

     

     

    MVC

    Swing 甚至走得更遠一步,在基本的 UI 原則之上又放上了一個公共的設計模式。這個設計模式叫做模型-視圖-控制器(Model-View-ControllerMVC),它試圖把角色分開MVC 讓負責顯示的代碼、處理數據的代碼、對交互進行響應并驅動變化的代碼彼此分離。

    有點迷惑?如果我為這個設計模式提供一個現實世界的非技術性示例,它就比較容易了。請想像一次時裝秀。把秀場當成 UI,假設服裝就是數據,是展示給用戶的計算機信息。現在,假設這次時裝秀中只有一個人。這個人設計服裝、修改服裝、同時還在 T 臺上展示這些服裝。這看起來可不是一個構造良好的或有效率的設計。

    現在,假設同樣的時裝秀采用 MVC 設計模式。這次不是一個人做每件事,而是將角色分開。時裝模特(不要與 MVC 縮寫中的模型混淆)展示服裝。他們扮演的角色是視圖。他們知道展示服裝(數據的)適當方法,但是根本不知道如何創建或設計服裝。另一方面,時裝設計師充當控制器。時裝設計師對于如何在 T 臺上走秀沒有概念,但他能創建和操縱服裝。時裝模特和設計師都能獨立地處理服裝,但都有自己的專業領域。

    這就是 MVC 設計模式背后的概念:讓 UI 的每個方面處理它擅長的工作。如果您仍然不明白,那么教程后面的示例有望消除您的迷惑 —— 但是在您繼續進行的時候,請記住基本的原則:用可視組件顯示數據,同時讓其他類操縱數據。

    JComponent

    Swing 的整個可視組件庫的基礎構造塊是 JComponent。它是所有組件的父類。它是一個抽象類,所以不能創建 JComponent,但是作為類層次結構的結果,從字面意義來說它包含了數百個函數,Swing 中的每個組件都可以使用這些函數。顯然,有些概念要比其他概念重要,所以對于本教程,需要學習的重要的東西是:

    • JComponent 不僅是 Swing 組件的基類,還是定制組件的基類(有關的更多信息在“中級 Swing”教程中)。
    • 它為所有組件提供了繪制的基礎架構 —— 一些方便進行組件定制的東西(同樣,在“中級 Swing”中,有關于這個主題的更多信息)。
    • 它知道如何處理所有的鍵盤按鍵。所以類只需要偵聽特定的鍵。
    • 它包含 add() 方法,可以添加其他 JComponent。換種方式來看,可以把任意 Swing 組件添加到其他任何 Swing 組件,從而構造嵌套組件(例如,JPanel 包含 JButton,甚至包含一些古怪的組合,例如 JMenu 包含 JButton)。

    簡單的swing小部件

    JLabel

    Swing 庫中最基礎的組件是 JLabel。它所做的正是您所期望的:呆在那兒,看起來很漂亮,描述其他組件。下圖顯示了的 JLabel 實際應用:

    JLabel


    不太吸引人,但是仍然有用。實際上,在整個應用程序中,不僅把 JLabel 用作文本描述,還將它用作圖片描述。每當在 Swing 應用程序中看到圖片的時候,它就有可能是 JLabel。JLabel 對于 Swing 初學者來說沒有許多意料之外的方法。基本的方法包括設置文本、圖片、對齊以及標簽描述的其他組件:

    • get/setText(): 獲取/設置標簽的文本。
    • get/seticon(): 獲取/設置標簽的圖片。
    • get/setHorizontalAlignment(): 獲取/設置文本的水平位置。
    • get/setVerticalAlignment(): 獲取/設置文本的垂直位置。
    • get/setDisplayedMnemonic(): 獲取/設置標簽的訪問鍵(下劃線文字)。
    • get/setLableFor(): 獲取/設置這個標簽附著的組件,所以當用戶按下 Alt+訪問鍵時,焦點轉移到指定的組件。

     

     JButton

    Swing 中的基本動作組件 JButton,是與每個窗口中都能看到的 OK 和 Cancel 一樣的按鈕;這些按鈕所做的正是您希望它們做的工作 —— 在單擊它們之后,將發生一些事情。到底會發生什么呢?您必須定義發生的內容(請參閱 事件,以獲得更多信息)。一個 JButton 實例看起來如下所示:

    JButton


    用來改變 JButton 屬性的方法與 JLabel 的方法類似(您可能發現,在大多數 Swing 組件中,這些屬性都類似)。它們控制文本、圖片和方向:

    • get/setText(): 獲取/設置標簽的文本。
    • get/seticon(): 獲取/設置標簽的圖片。
    • get/setHorizontalAlignment(): 獲取/設置文本的水平位置。
    • get/setVerticalAlignment(): 獲取/設置文本的垂直位置。
    • get/setDisplayedMnemonic(): 獲取/設置訪問鍵(下劃線字符),與 Alt 按鈕組合時,造成按鈕單擊。

    除了這些方法,我還要介紹 JButton 包含的另外一組方法。這些方法利用了按鈕的所有不同狀態。狀態是對組件進行描述的一個屬性,通常采用真/假設置。在 JButton 中,可以包含以下可能狀態:活動/不活動、選中/沒選中、鼠標經過/鼠標離開、按下/沒按下,等等。另外,可以組合這些狀態,例如按鈕可以在鼠標經過的同時被選中。現在您可能會問自己用這些狀態到底要做什么。作為示例,請看看您的瀏覽器上的后退按鈕。請注意在鼠標經過它的時候,圖片是如何變化的,在按下該按鈕時,圖片又是如何變化的。這個按鈕利用了不同的狀態。每個狀態采用不同的圖片,這是提示用戶交互正在進行的一種普遍并且有效的方式。JButton 上的狀態方法是:

    • get/setDisabledIcon()
    • get/setDisableSelectedIcon()
    • get/setIcon()
    • get/setPressedIcon()
    • get/setRolloverIcon()
    • get/setRolloverSelectedIcon()
    • get/setSelectedIcon()

     

    JTextField

    Swing 中的基本文本組件是 JTextField,它允許用戶在 UI 中輸入文本。我肯定您熟悉文本字段:要掌握本教程,則必須使用一個文本字段輸入用戶名和口令。您輸入文本、刪除文本、選中文本、把文字四處移動 —— Swing 替您負責所有這些工作。作為 UI 開發人員,利用 JJTextField 時,實際上并不需要做什么。

    在任何情況下,這是 JTextField 實際使用時看起來的樣子:

    JTextField


    在處理 JTextField 時,只需要關注一個方法 —— 這應當是很明顯的,這個方法就是設置文本的方法: get/setText(),用于獲取/設置 JTextField 中的文本。

     

    JFrame

    迄今為止,我介紹了 Swing 的三個基本構造塊:標簽、按鈕和文本字段;但是現在需要個地方放它們,希望用戶知道如何處理它們。JFrame 類就是做這個的——它是一個容器,允許您把其他組件添加到它里面,把它們組織起來,并把它們呈現給用戶。它有許多其他好處,但是我認為先看看它的圖片最簡單:

    JFrame


    JFrame 實際上不僅僅讓您把組件放入其中并呈現給用戶。比起它表面上的簡單性,它實際上是 Swing 包中最復雜的組件。為了最大程度地簡化組件,在獨立于操作系統的 Swing 組件與實際運行這些組件的操作系統之間,JFrame 起著橋梁的作用。JFrame 在本機操作系統中是以窗口的形式注冊的,這么做之后,就可以得到許多熟悉的操作系統窗口的特性:最小化/最大化、改變大小、移動。但是對于本教程的目標來說,把 JFrame 當作放置組件的調色板就足夠了。可以在 JFrame 上調用的一些修改屬性的方法是:

    • get/setTitle(): 獲取/設置幀的標題。
    • get/setState(): 獲取/設置幀的最小化、最大化等狀態。
    • is/setVisible(): 獲取/設置幀的可視狀態,換句話說,是否在屏幕上顯示。
    • get/setLocation(): 獲取/設置幀在屏幕上應當出現的位置。
    • get/setsize(): 獲取/設置幀的大小。
    • add(): 將組件添加到幀中。

     

     

    簡單應用程序

    就像所有的“x 入門教程一樣,本教程也包含必不可少的 HelloWorld 演示。但這個示例不僅對觀察 Swing 應用程序如何工作有用,還對確保設置正確很有用。一旦使這個簡單的應用程序能夠成功運行,那么之后的每個示例也將能夠運行。下圖顯示了完成后的示例:

    HelloWorld 示例

    第一步是創建類。將組件放在 JFrame 上的 Swing 應用程序需要繼承JFrame 類,如下所示:

    public class HelloWorld extends JFrame 

    這樣做之后,就得到上面描述的所有 JFrame 屬性,最重要的是操作系統對窗口的本機支持。下一步是把組件放在屏幕上。在這個示例中,使用了一個 null 布局。在教程的后面部分,您將學到更多關于布局和布局管理器的內容。但對于這個示例,可以用數字表示 JFrame 上的像素位置:

       public HelloWorld() 
       { 
          super(); 
          this.setSize(300, 200); 
          this.getContentPane().setLayout(null); 
          this.add(getJLabel(), null); 
          this.add(getJTextField(), null); 
          this.add(getJButton(), null); 
          this.setTitle("HelloWorld"); 
       } 
      
       private javax.swing.JLabel getJLabel() { 
          if(jLabel == null) { 
             jLabel = new javax.swing.JLabel(); 
             jLabel.setBounds(34, 49, 53, 18); 
             jLabel.setText("Name:"); 
          } 
          return jLabel; 
       } 
      
       private javax.swing.JTextField getJTextField() { 
          if(jTextField == null) { 
             jTextField = new javax.swing.JTextField(); 
             jTextField.setBounds(96, 49, 160, 20); 
          } 
          return jTextField; 
       } 
      
       private javax.swing.JButton getJButton() { 
          if(jButton == null) { 
             jButton = new javax.swing.JButton(); 
             jButton.setBounds(103, 110, 71, 27); 
             jButton.setText("OK"); 
          } 
          return jButton; 
       } 

    現在組件都放在了 JFrame 上,并且需要在屏幕上顯示 JFrame,并讓應用程序可以運行。就像在所有的 Java 應用程序中一樣,必須添加一個 main 方法,才能讓 Swing 應用程序運行。在這個 main 方法中,只需要創建 HelloWorld 應用程序對象,然后調用其setVisible()即可:

      
       public static void main(String[] args) 
       { 
          HelloWorld w = new HelloWorld(); 
          w.setVisible(true); 
       } 

    完成了!這就是創建應用程序的所有過程。

     

    完整代碼如下:

     

    package cn.edu.jnu.www;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.event.*;
    public class HelloWorld extends JFrame{
     private JLabel jLabel;
     private JTextField jTextField;
     private JButton jButton;
     
    public HelloWorld()
    {
       super();
       this.setSize(300, 200);
       this.getContentPane().setLayout(null);
       this.add(getJLabel(), null);
       this.add(getJTextField(), null);
       this.add(getJButton(), null);
       this.setTitle("HelloWorld");
    }

    private javax.swing.JLabel getJLabel() {
       if(jLabel == null) {
          jLabel = new javax.swing.JLabel();
          jLabel.setBounds(34, 49, 53, 18);
          jLabel.setText("Name:");
       }
       return jLabel;
    }

    private javax.swing.JTextField getJTextField() {
       if(jTextField == null) {
          jTextField = new javax.swing.JTextField();
          jTextField.setBounds(96, 49, 160, 20);
       }
       return jTextField;
    }

    private javax.swing.JButton getJButton() {
       if(jButton == null) {
          jButton = new javax.swing.JButton();
          jButton.setBounds(103, 110, 71, 27);
          jButton.setText("OK");
       }
       return jButton;
    }


    public static void main(String[] args)
    {
       HelloWorld w = new HelloWorld();
       w.setVisible(true);
    }

    }




    附加的swing小部件(上)

    JComboBox

    在這一節中,我將介紹 Swing 庫中的其他全部組件、如何使用它們、它們看起來是什么樣的,等等,這部分內容應當讓您更好地了解 Swing 為 UI 開發人員提供了什么。

    我們從 JComboBox 開始介紹。組合框與下拉選擇相似,區別在于使用組合框時用戶可以不從列表中選擇項目,還可以選擇一個(而且只有一個)項目。在某些版本的組合框中,還可以輸入自己的選擇。瀏覽器的地址欄就是一個示例:它是一個允許輸入自己選項的組合框。以下是 JComboBox 在 Swing 中看起來的樣子:

    JComboBox
    JComboBox

    JComboBox 的重要函數包括 JComboBox 包含的數據。需要有一種方法來設置 JComboBox 中的數據、修改數據、在用戶選擇時得到用戶的選擇。可以使用以下 JComboBox 方法:

    • addItem()添加一個項目到 JComboBox.
    • get/setSelectedIndex()獲取/設置 JComboBox 中選中項目的索引。
    • get/setSelectedItem()獲取/設置選中的對象。
    • removeAllItems()從 JComboBox 刪除所有對象。
    • remoteItem()從 JComboBox 刪除特定對象。

    JTextField

    JTextField 的一個細微變化是 JPasswordField,它允許您隱藏在文本字段區域中顯示的字符。畢竟,在您輸入口令的時候,如果每個人都能看到,那可沒什么好處?可能根本就不好,而且在私人數據如此脆弱的今天,您需要所有能夠得到的幫助。以下是 JPasswordField 在 Swing 中看起來的樣子:

    JPasswordField
    JPasswordField

    JPasswordField 上額外的“安全性”方法對 JTextField 的行為做了輕微改變,所以不能閱讀文本:

    • get/setEchoChar()獲取/設置每次字符輸入時在 JPasswordField 中顯示的字符。在獲取口令時,不會返回“回聲”,而是返回實際的字符。

    • getText() 不應當 使用這個函數,因為它會帶來可能的安全問題(String 會保存在內存中,可能的堆棧轉儲會暴露口令)。

    • getPassword()這是從 JPasswordField 中獲得口令的恰當方法,因為它返回一個包含口令的 char[]。為了保證恰當的安全性,數組應當被清為 0,以確保它不會保留在內存中。

     JCheckBox/JRadioButton

    JCheckBox 和 JRadioButton 組件向用戶呈現選項,通常采用多選的格式。區別是什么?從實踐的角度來說,它們沒有那么不同。它們的行為方式相同。但是,在一般的 UI 實踐中,它們有細微差異:JRadioButton 通常組合在一起,向用戶呈現帶有必選答案的問題,而且這些答案具有強制性(這意味著問題只能有一個答案)。JRadioButton 的行為保證了這個用法。一旦選擇了JRadioButton,就不能取消對它的選擇,除非選擇了在同一組中的另外一個單選鈕。從效果上看,這就保證了選項的惟一和必選。JCheckBox 的不同在于,允許隨機地選擇/取消除選擇,并允許為問題選擇多個答案。

    這里是個示例。問題“您是男孩還是女孩!”有兩個惟一答案選項“男孩”或“女孩”。用戶必須選擇一個,不能同時選中。另一方面,問題“您的習慣是什么?”的答案有“跑步”、“睡覺”或“閱讀”,不應當只允許為此問題選擇一個答案,因為人們可能有不止一個習慣。

    把這些 JCheckBoxe 或 JRadioButton 捆綁成一組的類是 ButtonGroup 類。它允許把選項組織在一起(例如“男孩”和“女孩”),這樣,其中一個被選擇時,另外一個就自動取消選擇。

    以下是 JCheckBox 和 JRadioButton 在 Swing 中看起來的樣子:

    JCheckBox 和 JRadioButton
    JCheckBox/JRadioButton

    需要記住的重要的 ButtonGroup 方法是:

    • add()添加 JCheckBox 或 JRadioButton 到 ButtonGroup。
    • getElements()獲得 ButtonGroup 中的全部組件,允許對它們進行迭代,找到其中選中的那個。

     JMenu/JMenuItem/JMenuBar

    JMenu、JMenuItem 和 JMenuBar 組件是在 JFrame 中開發菜單系統的主要構造塊。任何菜單系統的基礎都是 JMenuBar。它平淡而乏味,但卻是必需的,因為每個 JMenu 和 JMenuItem 都要用它構建。要用 setJMenuBar() 方法把 JMenuBar 附著到 JFrame。一旦將它附加到 JFrame 中,就可以添加所有想要的菜單、子菜單和菜單項。

    JMenu/JMenuItem 的區別看起來可能很明顯,但實際上,在幕后看起來并不像表面那樣。看看類的類層次結構,就知道JMenuJMenuItem 的子類。但是,在表面上,它們是有區別的:用 JMenu 包含其他 JMenuItem 和 JMenu;JMenuItem 在選中時觸發操作。

    JMenuItem 也支持快捷鍵的概念。與您用過的大多數應用程序一樣,Swing 應用程序允許您按下 Ctrl+(某個鍵)來觸發一個操作,就像選中菜單鍵本身一樣。想想用來剪切和粘貼的快捷鍵 Ctrl+X 和 Ctrl+V。

    除此之外,JMenu 和 JMenuItem 都支持訪問鍵。用 Alt 鍵與某個字母關聯,模擬菜單本身的選擇(例如,在 Windows 中按下 Alt+F,然后按下 Alt+x 就可以關閉應用程序)。

    以下是包含 JMenu 和 JMenuItem 的 JMenuBar 在 Swing 中的樣子:

    JMenuBar、JMenu 和 JMenuItem
    JMenuBar/JMenu/JMenuItem

    這些類需要的重要方法是:

    • JMenuItem and JMenu:
      • get/setAccelerator()獲取/設置用作快捷鍵的 Ctrl+鍵。
      • get/setText()獲取/設置菜單的文本。
      • get/setIcon()獲取/設置菜單使用的圖片。


    • JMenu 專用:
      • add()添加另外一個 JMenu 或 JMenuItem 到 JMenu(創建嵌套菜單)。

     JSlider

    在應用程序中 JSlider 支持數值變化。它是一種迅速而簡單的方式,不僅能讓用戶以可視形式獲得他們當前選擇的反饋,還能得到可以接受的值的范圍。想像一下這種情況:可以提供一個文本字段,允許用戶輸入值,但是這樣做就帶來了額外的麻煩,要確保輸入的值是數字,還要確保數字符合要求的數值范圍。例如,如果有一個金融 Web 站點,它向您提問要在股票上投資的百分比,那么您不得不檢查在文本字段中輸入的值,以確保它們是數字,而且在 0 到 100 之間。如果換用 JSlider,那么就可以確保選擇的是指定范圍內的數字。

    在 Swing 中,JSlider 看起來如下所示:

    JSlider
    JSlider

    JSlider 中的重要方法是:

    • get/setMinimum()獲取/設置可以選擇的最小值。
    • get/setMaximum()獲取/設置可以選擇的最大值。
    • get/setOrientation()獲取/設置 JSlider 是上/下還是左/右滾動條。
    • get/setValue()獲取/設置 JSlider 的初始值。

     JSlider

    與 JSlider 非常像,可以用 JSpinner 允許用戶選擇一個整數值。JSlider 的一個主要優勢就是比 JSlider 的空間緊湊。但是,它的不足就是無法方便地設置其邊界。

    但是,兩個組件之間的比較僅此而已。JSpinner 更加靈活,可以用來在任意組的值之間進行選擇。除了在數字間選擇,它還可以用來在日期、名稱、顏色和任何事之間進行選擇。這使 JSpinner 極為強大,允許您提供其中只包含預定義的選擇的組件。使用這種方式,它與 JComboBox 類似,但是它們的應用不能互換。只應把 JSpinner 用在邏輯上連續的選擇 —— 數字和日期是最合邏輯的選擇。而另一方面,在呈現看起來隨機的選擇并且選擇之間沒有連接的時候,JComboBox 是更好的選擇。

    JSpinner 看起來如下所示:

    JSpinner
    JSpinner

    重要方法是:

    • get/setValue()獲取/設置 JSpinner 的初始值,在基本實例中,需要是整數。
    • getNextValue()獲取按下上箭頭按鈕之后應當選中的下一個值。
    • getPreviousValue()獲取按下下箭頭按鈕之后應當選中的前一個值。

     JToolBar

    JToolBar 充當其他組件(JButton、JComboBoxe 等)的調色板,共同構成您在大多數應用程序中熟悉的工具欄。工具欄允許程序把常用的命令放在可以迅速發現的位置,并把它們以常用命令組的形式組合在一起。一般(但不總是這樣)情況下,工具欄按鈕在菜單欄中會有對應的命令。雖然這不是必需的,但已經變成了一種公共實踐,您也應當試著這么做。

    JToolBar 也提供了您在其他工具欄中看到過的其他功能:“浮動”的能力(也就是成為主幀頂部獨立的幀)。

    下圖顯示了一個非浮動 JToolBar:

    非浮動 JToolBar
    非浮動 JToolBar

    對于 JToolBar,要記住的重要方法是:is/setFloatable(),它獲取/設置 JToolBar 是否可以浮動。

     JToolTip

    您可能到處都看到過 JToolTip,但是從來不知道它們叫什么。它們就像您鞋帶上的塑料部件 —— 到處都有,但是您就是不知道它們正確的名字(如果您想知道,那么可以叫它們 金屬箍)。JToolTip 就是您將鼠標停留在某個東西上面的時候彈出來的小“泡泡”。它們在應用程序中可能非常有用,可以為難用的項目提供幫助、擴展信息,甚至在擁擠的 UI 中顯示某個項目的完整文本。在 Swing 中,可以通過把鼠標放在某個組件上的特定時間來觸發它們;它們通常在鼠標處于不活動狀態大約 1 秒鐘之后顯示。只要鼠標還停留在那個組件上,它們就保持可見。

    JToolTip 的重要部分是它的易用性。setToolTip() 方法是 JComponent 類中的一個方法,這意味著每個 Swing 組件都能有一個與之關聯的工具提示。雖然 JToolTip 本身也是一個 Swing 類,但目前,對于您的需要,它確實沒有提供更多功能,而且本身也不該被創建。可以通過調用 JComponent 的 setToolTip() 函數訪問和使用它。

    以下是 JToolTip 看起來的樣子:

    A JToolTip
    JToolTip



    附加的swing小部件(下)

    JOptionPane

    JOptionPane 是在 Swing 中類似“快捷方式”的東西。通常,作為 UI 開發人員,您需要向用戶呈現快速信息,讓用戶了解錯誤和信息。甚至可能想得到一些快速數據,例如名稱或數字。在 Swing 中,JOptionPane 類為這些東西提供了快捷方式,但這并不是它必須完成的任務。不需要讓每個開發人員重頭開始重復相同的工作,Swing 已經提供了這個基本的但很有用的類,為 UI 開發人員提供了獲取和接收簡單消息的簡易方法。

    以下是一個 JOptionPane:

    JOptionPane
    JOptionPane

    使用 JOptionPane 時有點麻煩的是可以使用的全部選項。雖然簡單,但是它仍然提供了大量選項,這些選項有可能造成混淆。學習 JOptionPane 的最好方法就是使用它;編寫代碼,觀察彈出的是什么。這個組件幾乎可以讓您修改它的每一方面:幀標題、消息本身、顯示的圖標、按鈕選項,以及是否需要文本響應。因為有太多的可能性,無法在本教程中一一列舉它們,所以您最好是訪問 JOptionPane 的 API 頁面,查看它的眾多可能性。

     JTextArea

    JTextArea 比 JTextField 更進了一步。JTextField 被局限在一行文本中,而 JTextArea 擴展了這個能力,支持多行文本。可以把它想像成一個空白頁,您可以在其中的任意地方進行輸入。正如您可能猜到的,JTextArea 包含許多與 JTextField 相同的功能,畢竟,它們實際上是相同的組件。但是 JTextArea 提供了一些額外的重要功能,可以把它區別開。這些功能包括單詞自動換行的能力(即把長文本自動換行到下一行,而不是將單詞從中斷開)、對文本自動換行的能力(即把長的文本行移動到下一行,而不是創建一個需要水平滾動條的非常長的行)。

    Swing 中的 JTextArea 看起來就像您期望的那樣:

    A JTextArea
    JTextArea

    支持行和單詞的自動換行的重要方法是:

    • is/setLineWrap()設置在行過長的時候是否要自動換行。
    • is/setWrapStyleWord()設置在單詞過長的時候是否要把長單詞移到下一行。

     JScrollPane

    上面的示例構造完成之后,假設 JTextArea 包含太多文本,而給定的空間中容納不下,那這該怎么辦?如果您以為會自動出現滾動條,那么很不幸,您錯了。JScrollPane 添補了這個空白,為 Swing 組件提供了處理所有與滾動條相關的動作。所以雖然為每個需要的組件提供滾動塊可能有些痛苦,但是一旦添加了它,它就會自動處理每件事,包括在需要的時候隱藏/顯示滾動條。

    除了用需要自動換行的組件創建 JScrollPane 之外,不必直接處理它。根據上面的示例,用 JTextArea 調用 JScrollPane 的構造函數,這為 JTextArea 創建了在文本過長時滾動的能力:

     JScrollPane scroll = new JScrollPane(getTextArea()); add(scroll); 

    更新后的示例看起來如下所示:

    JScrollPane 示例
    JScrollPane

    JScrollPane 也公開了它將創建的兩個 JScrollBar。這些 JScrollBar 組件也包含一些方法,可以用這些方法來修改組件的行為(雖然它們不在本教程的范圍之內)。

    使用 JScrollPane 需要的方法是:

    • getHorizontalScrollBar()返回水平的 JScrollBar 組件。
    • getVerticalScrollBar():返回垂直的 JScrollBar 組件.
    • get/setHorizontalScrollBarPolicy()這個“策略”可以是以下三個之一:Always、Never 或 As Needed。
    • get/setVerticalScrollBarPolicy()與水平函數相同。

    JList

     

    JList 是一個有用的組件,用于向用戶呈現許多選擇。可以把它當作 JComboBox 的擴展。JList 提供了更多選擇,并添加了多選的能力。在 JList 與 JComboBox 之間進行選擇通常取決于以下兩個特性:如果需要多選,或者選擇的選項超過 15 個(雖然這個數字并不是通用規則),那么就應當選擇 JList。

    應用將 JList 與 JScrollPane 結合使用,就像上面演示的那樣,因為它能夠呈現比它的空間所能容納的更多的選項。

    JList 包含選擇模型的概念(在 JTable 中也會看到),在這里,可以設置 JList 接受不同類型的選擇。這些類型是:單一選擇(只能選擇一項)、單一間隔選擇(只能選擇相鄰選項),以及任意多項或者多項間隔選擇(可以選擇任意數量、任意組合的選擇)。

    JList 是第一個我稱為 “復雜組件” 的組件,該復雜組件還包含 JTable 和 JTree,它們支持大量的定制變化,其中包括改變 UI 的表現方式、處理數據的方式。因為本教程只是想介紹基礎知識,所以我不想深入這些更高級的功能,但是在使用這些組件時有件事需要記住 —— 它們帶來的挑戰要比目前為止介紹過的所有組件都大。

    JList 在 Swing 中看起來如下所示:

    JList
    JList

    JList 中有許多處理數據的函數,而且根據我的說法,這些也只不過是使用 JList 的細節的皮毛而已。以下是一些基本方法:

    • get/setSelectedIndex()獲取/設置列表中選中的行;在多選擇列表的情況下,返回一個 int[]
    • get/setSelectionMode()與上面解釋的一樣,獲取/設置選擇模式,模式有:單一、單一間隔和多選間隔。
    • setListData()設置在 JList 中使用的數據。
    • get/setSelectedValue()獲得選中的對象(與選中行號對應)。

     JTable

    在考慮 JTable 時,請想像一下一個 Excel 工作表,這樣就可以對 JTable 在 Swing 中的作用有一個清晰的印象。它與工作表共享許多相同的特征:單元格、行、列、移動列、隱藏列等。JTable 把 JList 的想法更進了一步。它不是在一列中顯示數據,而是在多列中顯示數據。讓我們以人為例。JList 只能顯示人的一個屬性 —— 例如他或她的名字。而 JTable 就能夠顯示多個屬性 —— 名字、年齡、地址,等等。JTable 是支持提供數據的大多數信息的 Swing 組件。

    不幸的是,作為代價,JTable 也是最難對付的 Swing 組件。許多 UI 開發人員都為了學習 JTable 的每個細節而頭痛。在這里,我希望我把能把您解救出來,只用您的 JTable 知識處理問題。

    許多 JList 中的概念也擴展到了 JTable,其中包括不同的選擇間隔的概念。但是 JList 中一列的概念變成了 JTable 的單元格的概念。這意味著在 JTable 中進行選擇時會有不同的方式,例如列、行或者一個單元格。

    在 Swing 中,JTable 看起來如下所示:

    JTable
    JTable

    最后,JTable 的大多數函數都超出本教程的范圍;“中級 Swing”會深入這個復雜組件的更多細節。

     JTree

    JTree 是另外一個復雜組件,它不像 JTable 那樣難用,但是也不像 JList 那么容易。使用 JTree 時麻煩的部分是它要求的數據模型。

    JTree 的功能來自樹的概念,樹有分支和葉子。您在 Windows 中使用 IE 瀏覽器時,可能非常熟悉這個概念 —— 可以展開和折疊分支,顯示可以選擇和取消選擇的不同葉子。

    您很有可能發現樹在應用程序中不像表格或列表那樣有用,所以在 Internet 上沒有許多有幫助的這方面的示例。實際上,像 JTable 一樣,JTree 沒有什么入門級的功能。如果決定使用 JTree,那么立即就可以達到中級水平,當然還必須學習隨之而來的概念。因此,示例應用程序沒有介紹 JTree,所以也很不幸,不管是入門教程還是中級教程,都沒有涉及這個不太流行的組件。

    但是,樹有一些時候是符合需求的合理的 UI 組件。文件/目錄系統就是一個示例(就像在 IE 瀏覽器中那樣),而且當數據采取層次結構的時候,也就是說數據采用樹的形式的時候,JTree 就是最佳組件。

    在 Swing 中,JTree 看起來如下所示:

    JTree
    JTree



    Swing概念

    布局、模型和事件

    既然您已經知道了大多數(肯定不是全部)可以用來制作 UI 的組件,那么就必須實際用它們做些什么。您不能只是隨意地把它們放在屏幕上,然后就指望它們立即就能工作。您必須把它們放在特定的點上,對它們的交互作出反應,然后根據交互更新它們,用數據填充它們。要填滿 UI 知識的這片空白,還需要更多地學習 UI 的其他重要部分。

    所以,讓我們來研究以下內容:

     

    • 布局:Swing 包括許多布局,布局也是類,負責處理組件在應用程序中的擺放位置,以及在應用程序改變尺寸或者刪除、添加組件時對組件進行相應處理。

    • 事件:您需要對按下按鈕、單擊鼠標和用戶在 UI 上能做的每件事進行響應。想像一下,如果不能響應會發生什么 —— 用戶單擊之后,什么變化也沒有。

    • 模型: 對于更高級的組件(列表、表格和樹),以及一些像 JComboBox 這樣的更容易的組件來說,模型是處理數據最有效的途徑。它們把大部分處理數據的工作從實際的組件本身撤出來(請回想一下前面討論的 MVC),并提供了一個公共數據對象類(例如 VectorArrayList)的包裝器。

    簡單布局

    就像在前面提到過的,布局替您處理組件在應用程序中的擺放。您的第一個問題可能是“為什么不能用像素告訴它應當在什么地方呢?”是的,您可以這樣做,但是在窗口改變大小的時候,或者更糟一些情況,即用戶改變其屏幕的分辨率的時候,亦或在有人想在其他操作系統上試用應用程序的時候,您立刻就會遇到麻煩。布局管理器把這些擔心一掃而空。不是每個人都用相同的設置,所以布局管理器會創建“相對”布局,允許您指定組件相對于其他組件的擺放方式,決定事物改變尺寸的方式。這是好的部分:比聽起來更容易。只要調用 setLayout(yourLayout) 設置布局管理器即可。后面對 add() 的調用可以將組件添加到容器中,并讓布局管理器負責將它放在應當的位置上。

    目前在 Swing 中包含了大量布局;看起來好象每次發布都會有一個新布局負責不同的目的。但是,有些經過實踐檢驗的布局一直存在,而且會永遠存在,我指的是永遠 —— 因為從 1995 年 Java 語言的第一個發行版開始,就有這些布局。這些布局是:FlowLayout、GridLayout 和 BorderLayout。

    FlowLayout 從左到右安排組件。當空間不足時,就移到下一行。它是使用起來最簡單的布局,因此,也就是能力最弱的布局:

     setLayout(new FlowLayout()); add(new JButton("Button1")); add(new JButton("Button2")); add(new JButton("Button3")); 

    FlowLayout 實例
    FlowLayout

    GridLayout 就像您想像的那樣工作:它允許指定行和列的數量,然后在添加組件時把組件放在這些單元格中:

     setLayout(new GridLayout(1,2)); add(new JButton("Button1")); add(new JButton("Button2")); add(new JButton("Button3")); 

    GridLayout 實例
    GridLayout

    即使 Swing 中添加了許多新的布局管理器,BorderLayout 仍然是其中非常有用的一個。即使有經驗的 UI 開發人員也經常使用 BorderLayout。它使用東、南、西、北、中的概念在屏幕上放置組件:

     setLayout(new BorderLayout()); add(new JButton("Button1"), "North"); add(new JButton("Button2"), "Center"); add(new JButton("Button3"), "West"); 

    BorderLayout 實例
    BorderLayout

     GridBagLayout

    雖然上面的示例對于簡單的布局來說很好,但是更高級的 UI 需要更高級的布局管理器。這是 GridBagLayout 發揮作用的地方。不幸的是,使用它的時候極易混淆、極為困難,每個曾經用過它的人都會同意這點。我也不能反對;但是除了它的困難之外,它可能是用 Swing 內置的布局管理器創建漂亮 UI 的最好方式。

    以下是我的第一個小建議:在最新版的 Eclipse 中,有內置的可視化構建器,這個個小建議可以自動根據每個屏幕的需要來構建必需的 GridBagLayout 代碼。請使用這個功能!它會節約無數為了讓數字正確而浪費的時間。所以在我用這一節解釋 GridBagLayout 如何工作、如何調整它才能讓它做得最好時,建議您去找一個可視化構建器并生成代碼。它會節約您的工作時間

    事件

    最后,我們來到 Swing 最重要的一部分:處理事件,對 UI 的交互作出反應。Swing 用事件/偵聽器模型處理事件。這個模型的工作方式是:允許某個類登記到某個組件的某個事件上。登記到事件的這個類叫做偵聽器,因為它等候組件的事件發生,而且在事件發生時采取行動。組件本身知道如何“激活”事件(即,知道它能生成的交互類型,以及如何讓偵聽器知道這個交互什么時候發生)。組件與包含有關交互信息的事件和類針對交互進行通信。

    把技術方面的空談放在一邊,我們來看幾個 Swing 中事件的實例。首先從最簡單的示例開始,即一個 JButton,按下它的時候,會在控制臺上輸出“Hello”。

    JButton 知道它什么時候被按下;這是在內部處理的,不需要代碼處理它。但是,偵聽器需要進行登記,以接收來自 JButton 的事件,這樣您才能輸出“Hello”。listener 類通過實現 listener 接口然后調用 JButton 上的 addActionListener() 做到這一點:

     // Create the JButton JButton b = new JButton("Button"); // Register as a listener b.addActionListener(new HelloListener()); class HelloListener implements ActionListener { // The interface method to receive button clicks public void actionPerformed(ActionEvent e) { System.out.println("Hello"); } } 

    JList 也用類似的方式工作。當有人在 JList 中選中什么時,您可能想把選中的對象輸出到控制臺上:

     // myList is a JList populate with data myList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { Object o = myList.getSelectedItem(); System.out.println(o.toString()); } } ); 

    從這兩個示例,您應當能夠理解事件/偵聽器模型在 Swing 中如何工作了。實際上,Swing 中的每個交互都是以這種方式處理的,所以通過理解這個模型,您就立即能夠理解在 Swing 中如何處理每個事件,以及如何對用戶可能拋給您的任何交互做反應了。

    模型

    現在,您應當了解了 Java 的集合(Collection),這是一組處理數據的 Java 類。這些類包括 ArrayListHashMapSet。大多數應用程序在反復處理數據時,經常用這些類。但是,當需要在 UI 中使用這些數據類時,出現了一個限制。UI 不知道如何顯示它們。請先想一分鐘。如果有一個 JList 和一個某種數據對象(例如 Person 對象)的 ArrayListJList 怎樣才能知道要顯示什么?它是要顯示某個人的名字,還是連名帶姓一起顯示?

    這就是模型的概念發揮作用的地方了。雖然模型這個術語表達的范圍更大,但是在本教程的示例中,我用 UI 模型這個術語描述組件用來顯示數據的類。

    在 Swing 中每個處理集合數據的的組件都采用模型的概念,而且這也是使用和操縱數據的首選方法。它清晰地把 UI 的工作與底層數據分開(請回想 MVC 示例)。模型工作的機制是向組件描述如何顯示集合數據。我說的“描述”指的是什么呢?每個組件需要的描述略有不同:

     

    • JComboBox 要求其模型告訴它把什么文本作為選項顯示,以及有多少選項。

    • JSpinner 要求其模型告訴它顯示什么文本,前一個和下一個選擇是什么。

    • JList 也要求其模型告訴它把什么文本作為選項顯示,存在多少選項。

    • JTable 要求的更多:它要求模型告訴它存在多少列和多少行,列名稱、每列的類以及在每個單元格中顯示什么文本。

    • JTree 要求它的模型告訴它整個樹的根節點、父節點和子節點。

     

    您可能會問:為什么要做這么些工作?為什么要把這些功能分開?請想像以下場景:您有一個復雜的 JTable,有許多列數據,您在許多不同的屏幕上使用這個表格。如果您突然決定刪除某個列,那么怎么做會更容易呢?修改您使用的每個 JTable 實例中的代碼?還是創建一個可以在每個 JTable 實例中使用的模型類,然后只修改這一個模型類呢?顯然,所做的修改越少越好。

    模型示例

    我們來看看模型如何工作,在一個簡單的 JComboBox 示例中使用模型。在 JComboBox 前面的演示中,我介紹了如何調用 setItem() 向數據中添加項目。雖然對于簡單的演示,這樣做可以接受,但是在實際的應用程序中很少這么用。畢竟,在有 25 個選項,而且選項不斷變化的時候,您還真的想每次都調用 addItem() 25 次對這些選項進行迭代嗎?當然不是。

    JComboBox 包含一個方法調用 setModel(),它接受 ComboBoxModel 類的實例。應當用這個方法代替 addItem() 方法來創建 JComboBox 中的數據。

    假設有一個 ArrayList,其中使用字母表作為其數據(“A”、“B”、“C” ,等等):

     MyComboModel model = new MyComboModel(alphaList); myComboBox.setModel(model); public class MyComboModel implements ComboBoxModel { private List data = new ArrayList(); private int selected = 0; public MyComboModel(List list) { data = list; } public void setSelectedItem(Object o) { selected = data.indexOf(o); } public Object getSelectedItem() { return data.get(selected); } public int getSize() { return data.size(); } public Object getElementAt(int i) { return data.get(i); } } 

    采用模型時更好的地方是:您可以反復重用它。例如,假設 JComboBox 的數據需要從字母表變成 1 到27 的數字。那么只用一行就可以實現這個變化:用新的數據 List 添加 JComboBox,不需要使用額外的代碼:

     myComboBox.setModel(new MyComboModel(numberList)); 

    模型在 Swing 中是非常有好處的特性,因為它們提供了代碼重用功能,而且使數據處理更加容易。更常見的應用是在大型應用程序中,服務器端開發人員創建和檢索數據,并把數據傳遞給 UI 開發人員。如何處理這些數據和正確地顯示它們,取決于 UI 開發人員,而模型就是實現這項任務的工具。



    Swing入門(一)(2009-04-21 00:02:20)

    (轉自http://terrificwanjun.bokee.com)

    package cn.edu.jnu.www;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.event.*;
    public class test {
     public static void main(String[] args) {
      JFrame a=new JFrame("中繼數據庫系統");
      Container c=new  Container();
      //Swing更強調容器的概念,一般不允許之間將組件放置到頂層容器中
      //而是放在容器框架中,而awt則是直接放的
      a.setSize(200,200);
      a.setLocation(100, 200);
      a.setLayout(new BorderLayout());
      JButton b=new JButton("GO");
      c=a.getContentPane();
      c.add(b,BorderLayout.SOUTH);
      a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      a.setVisible(true);
     }

    }



    Swing學習(二)(2009-04-21 00:03:22)

    (轉自http://terrificwanjun.bokee.com)

     接觸java幾天,自己試著做了第一個java程序,其實只是一個簡單的對話框窗口,不過做起還是費了半天功夫,主要是對一些語法還不太熟悉,幸虧有CSDN上的朋友相助,問題得以解決.

    import java.awt.*;
    import javax.swing.*;

    public void class AboutDialog extends JDialog {              //這里誤用void,返回空值     
     
      public AboutDialog() {

       this.setTitle("About");                                                    //窗體標題顯示
               this.setSize(320, 200);                                                //窗體的大小
       
           JLabel about = new JLabel("關于:JAVA的一個窗口 :) ");             //對話框內容
            about.setHorizontalAlignment(SwingConstants.CENTER);     //內容顯示在窗口的中央
           this.getContentPane().add(about, BorderLayout.CENTER);
      }

      public static void main(String[] args) throws HeadlessException {
              AboutDialog kk = new  AboutDialog() ;
             kk.setVisible(true);                                                                             //原來的show()顯示已過時
             kk.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);       

     }

    }

     
     

    上面誤用void生成的結果,有興趣的朋友可以試試.另外查了一下J2SE API,才知道show( )方法已經被setvisible( )取代.



    使用Frame創建窗體




    在Awt中,Window類沒有邊界和菜單欄,所以不能直接使用Window類來創建窗體,必須使用Window類的子類Frame來創建,創建代碼為:

     

    package cn.edu.jnu.www;

    import java.awt.*;
    import java.awt.event.*;
    public class FrameTest {
     public static void main(String[] args) {
      // TODO 自動生成方法存根 
      Frame myFrame=new Frame("Hello");
      //Frame 是帶有標題和邊界的頂層窗口
      
      myFrame.setLocation(250, 150);
      
      //myFrame.setLayout(new BorderLayout(10,20));
      //設置窗體布局,BorderLayout里面的兩個參數用指定的組件之間的水平間距構造一個邊界布局。
      //BorderLayout為JAVA中的默認窗體布局
      
      //myFrame.setLayout(new FlowLayout(FlowLayout.LEFT));
      //設置窗體布局為FlowLayout,對齊方式居左對齊
      
      //myFrame.setLayout(new GridLayout(3,2));
      //設置窗體布局為GridLayout,將窗體分為6塊,3行2列
      myFrame.setSize(300,400);
      
      Button myButton1=new Button("east");
      Button myButton2=new Button("south");
      Button myButton3=new Button("west");
      Button myButton4=new Button("north");
      Button myButton5=new Button("center");
      
      //myFrame.add(myButton1,BorderLayout.EAST);
      myFrame.add(myButton1,"East");
      //兩種方法都可以,但是要注意大小寫
      myFrame.add(myButton2,BorderLayout.SOUTH);
      myFrame.add(myButton3,BorderLayout.WEST);
      myFrame.add(myButton4,BorderLayout.NORTH);
      myFrame.add(myButton5,BorderLayout.CENTER);
      
      //myFrame.addWindowListener(new myWindowListener());
      
      
      //使用適配器的方法實現監聽器作用
      //myFrame.addWindowListener(new yourWindowListener());
      
      //使用匿名內部類的方法實現監聽器的功能,只有含有適配器的事件才可以使用此方法
      myFrame.addWindowListener(new WindowAdapter(){
       public void windowClosing(WindowEvent e){
        System.exit(0);
       }
      });
      myFrame.setVisible(true);
      //myFrame.show();//eclipse 不建議使用show()方法
     }

    }


    //使用WindowAdapter適配器類來實現監聽器







    zhua : http://blog.sina.com.cn/s/blog_43c4b6530100cywl.html

    posted on 2009-06-19 10:03 找個美女做老婆 閱讀(92956) 評論(3)  編輯  收藏

    評論

    # re: swing入門教程 2013-10-21 21:25 wwcMonkey

    Very Good
      回復  更多評論   

    # re: swing入門教程[未登錄] 2014-11-12 15:26 1

    1  回復  更多評論   

    # re: swing入門教程[未登錄] 2015-11-18 16:47 123

    912  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    公告

    本blog已經搬到新家了, 新家:www.javaly.cn
     http://www.javaly.cn

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成全影视免费观看大全二| 国产精品免费视频播放器| 四虎亚洲精品高清在线观看| 永久在线毛片免费观看| 久久精品免费大片国产大片 | 亚洲视频在线观看视频| 狠狠久久永久免费观看| a毛片免费全部播放完整成| 亚洲av无码片区一区二区三区| 免费少妇a级毛片人成网| 亚洲成年人免费网站| 无人视频免费观看免费视频| 99ri精品国产亚洲| 免费h成人黄漫画嘿咻破解版| 日韩视频在线观看免费| 在线观看亚洲视频| 中文字幕亚洲第一在线| 亚洲国产一级在线观看| 91在线视频免费看| 在线毛片片免费观看| 久久亚洲精品11p| 色拍自拍亚洲综合图区| 亚洲国产精品日韩| 最新仑乱免费视频| 99热在线观看免费| 精品国产污污免费网站入口在线| 亚洲乱码在线观看| 亚洲黄色高清视频| 亚洲熟妇无码AV在线播放| 国产精品色午夜视频免费看| 在线人成精品免费视频| 在线观看黄片免费入口不卡| 另类专区另类专区亚洲| 亚洲国产综合精品中文第一| 亚洲第一精品福利| 亚洲精品字幕在线观看| 亚洲精品456播放| 免费观看日本污污ww网站一区 | 亚洲无人区一区二区三区| 日本一道本高清免费| 在线观看免费人成视频色9|