Java核心技術卷一基礎知識-第9章-Swing用戶界面組件-讀書筆記

第9章 Swing用戶界面組件

本章內容:
* Swing與模型-視圖-控制器設計模式
* 佈局管理概述
* 文本輸入
* 選擇組件
* 菜單
* 複雜的佈局管理
* 對話框
  1. 本章將介紹構造功能更加齊全的圖形用戶界面(GUI)所須要的一些重要工具。

9.1 Swing和模型-視圖-控制器設計模式

9.1.1 設計模式

  1. 容器和組件是「組合(composite)」模式。帶滾動條的面板是「裝飾器(decorator)」模式。佈局管理器是「策略(strategy)」模式。

9.1.2 模型-視圖-控制器模式

  1. 每一個組件都有三個要素:
  • 內容,如:按鈕的狀態(是否按下),或者文本框的文本。
  • 外觀(顏色,大小等)。
  • 行爲(對事件的反應)。
  1. 面向對象設計中的一個基本原則:限制一個對象擁有的功能數量
  2. 模型-視圖-控制器(MVC)模式告訴咱們如何實現這種設計,實現三個獨立的類:
  • 模型(model):存儲內容。
  • 視圖(view):顯示內容。
  • 控制器(controller):處理用戶輸入。
    模式必須實現改變內容和查找內容的方法。主機:模型是徹底不可見的。顯示存儲在模型中的數據是視圖的工做。
  1. 模型-視圖-控制器模式的一個優勢是一個模型能夠有多個視圖,其中每一個視圖能夠顯示所有內容或不一樣形式。
  2. 控制器負責處理用戶輸入事件。而後決定是否把這些事件轉化成對模型或視圖的改變。

9.1.3 Swing按鈕的模型-視圖-控制器分析

  1. 對於大多數組件來講,模型類將實現一個名字以Model結尾的接口。實現了此接口的類能夠定義各個按鈕的狀態。
  2. ButtonModel接口的屬性
    屬性名
    actionCommand 與按鈕關聯的動做命令字符串
    mnemonic 按鈕的快捷鍵
    armed 若是按鈕被按下且鼠標仍在按鈕上則爲true
    enabled 若是按鈕是可選擇的則爲true
    pressed 若是按鈕被按下且鼠標按鍵沒有釋放則爲true
    rollover 若是鼠標在按鈕之上則爲true
    selected 若是按鈕已經被選擇(用於複選框和單選按鈕)則爲true
  3. 模型不存儲按鈕標籤或者圖標。
  4. 一樣的模型(即DefaultButtonModel)可用於下壓按鈕、單選按鈕、複選框、甚至是菜單項。固然,這些按鈕都有各自不一樣的視圖和控制器。
  5. 一般,每一個Swing組件都有一個相關的後綴爲UI的視圖對象,但並非全部的Swing組件都有專門的控制器對象。
  6. JButton到底是什麼?事實上,它僅僅是一個繼承了JComponent的包裝器類,JComponent包含了一個DefaultButtonModel對象,一些視圖數據(例如按鈕標籤和圖標)和一個負責按鈕視圖的BasicButtonUI對象。

9.2 佈局管理概述

  1. 組件放置在容器中,佈局管理器決定容器中的組件具體放置的位置和大小。
  2. 文本域和其餘的用戶界面元素都繼承於Component類,組件能夠放置在面板這樣的容器中。因爲Container類繼承於Conponent類,因此容器也能夠放置在另外一個容器中。
  3. 繼承層次有兩點顯得有點混亂。首先,像JFrame這樣的頂層窗口是Container的子類,因此也是Component的子類,但卻不能放在其餘容器內。另外,JComponent是Container的子類,但不直接繼承Component,所以,能夠將其餘組件添置到JButton中。(但不管如何,這些組件沒法顯示出來)。
  4. 每一個容器都有一個默認的佈局管理器,但能夠從新進行設置。
  5. java.awt.Container 1.0
    • Void SetLayout(LayoutManager m)
      爲容器設置佈局管理器。
    • Component add(Component c)
    • Component add(Component c,Object constraints) 1.1
      將組件添加到容器中,並返回組件的引用。
      參數:c 要添加的組件。constraints 佈局管理器理解的標識符。
  6. java.awt.FlowLayout 1.0
    • FlowLayout()
    • FlowLayout(int align)
    • FlowLayout(int align,int hgap,int vgap)
      構造一個新的FlowLayout對象。
      參數:align LEFT、CENTER或者RIGHT。hgap 以像素爲單位的水平間距(若是是負值,則強行重疊)。vgap 以像素爲單位的垂直間距(若是爲負值,則強行重疊)。

9.2.1 邊框佈局

  1. 邊框佈局管理器(border layout manager)是每一個JFrame的內容窗格的默認佈局管理器。流佈局管理器徹底控制每一個組件的放置位置,邊框佈局管理器則否則,它容許爲每一個組件選擇一個放置位置。能夠選擇把組件放在內部窗格的中部、北部、南部、東部或者西部。
  2. 當容器被縮放時,邊緣組件的尺寸沒有改變,而中部組件的大小會發生變化。在添加組件時能夠指定BorderLayout類中的CENTER、NORTH、SOUTH、EAST和WEST常量。並不是須要佔有全部的位置,若是沒有提供任何值,系統默認爲CENTER。
  3. 與流佈局不用,邊框佈局會擴展全部組件的尺寸以便填充滿可用空間(劉佈局將維持每一個組件的最佳尺寸)。
  4. java.awt.BorderLayout 1.0
    • BorderLayout()
    • BorderLayout(int hgap,int vgap)
      構造一個新的BorderLayout對象。
      參數:hgap 以像素爲單位的水平間距(若是爲負值,則強行重疊),vgap 以像素爲單位的垂直間距(若是爲負值,則情形重疊)。

9.2.2 網格佈局

  1. 網格佈局像電子數據表同樣,按行列排列全部的組件。不過,它的每一個單元大小都是同樣的。
  2. java.awt.GridLayout 1.0
    • GridLayout(int rows,int columns)
    • GridLayout(int rows,int columns,int hgap,int vgap)
      構造一個新的GridLayout對象。row或者columns能夠爲零,但不能同時爲零,指定的每行或每列的組件數量能夠任意的。
      參數:rows 網格的行數,columns 網格的列數,hgap 以像素爲單位的水平間距(若是爲負值,則強行重疊),vgap 以像素爲單位的垂直間距(若是爲負值,則強行重疊)。

9.3 文本輸入

  1. 文本域(JTextField)和文本區(JTextArea)組件用於獲取文本輸入。文本域只能接收單行文本的輸入,而文本區可以接收多行文本的輸入。JPassword也只能接收單行文本的輸入,但不會將輸入的內容顯示出來。
    這三個類都繼承於JTextComponent類。因爲JTextComponent是一個抽象類,因此不可以構造這個類的對象。
  2. javax.swing.text.JTextComponent 1.2
    • String getText()
    • void setText(String text)
      獲取或設置文本組件中的文本。
    • boolean isEditable()
    • void setEditable(boolean b)
      獲取或設置editable特性,這個特性決定了用戶是否能夠編輯文本組件中的內容。

9.3.1 文本域

  1. 把文本域添加到窗口的經常使用方法是將它添加到面板或者其餘容器中,這與添加按鈕徹底同樣。
  2. 列數只是給AWT設定首選(preferred)大小的一個提示。若是佈局管理器須要縮放這個文本域,它會調整文本域的大小。
  3. 使用setColumns方法改變了一個文本域的大小以後,須要調用包含這個文本框的容器的revalidate方法。revalidate方法會從新計算容器內全部組件的大小,而且對它們從新進行佈局。調用revalidate方法以後,佈局管理器會從新設置容器的大小,而後就能夠看到改變尺寸後的文本域了。
    revalidate方法是JComponent類中的方法。它並非立刻就改變組件大小,而是給這個組件加一個須要改變大小的標記。這樣就避免了多個組件改變大小時帶來的重複計算。可是,若是想從新計算一個JFrame中的全部組件,就必須調用validate方法—JFrame沒有擴展JComponent。
  4. javax.swing.JTextField 1.2
    • JTextField(int cols)
      構造一個給定列數的空JTextField對象。
    • JTextField(String text,int cols)
      構造一個給定列數、給定初始字符串的JTextField對象。
    • int getColumns()
    • void setColumns(int cols)
      獲取或設置文本域使用的列數。
  5. javax.swing.JComponent 1.2
    • void revalidate()
      從新計算組件的位置和大小。
    • void setFont(Font f)
      設置組件的字體。
  6. java.awt.Component 1.0
    • void validate()
      從新計算組件的位置和大小。若是組件是容器,容器中包含的全部組件的位置和大小也被從新計算。
    • Font getFont()
      獲取組件的字體。

9.3.2 標籤和標籤組件

  1. 標籤是容納文本的組件,他們沒有任何的修飾(例如沒有邊緣),也不能響應用戶輸入。能夠利用標籤標識組件。
  2. 要想用標識符標識不帶標籤的組件,應該
    1)用相應的文本構造一個JLabel組件。
    2)將標籤組件放置在距離須要標識的組件足夠近的地方,以便用戶能夠知道標籤所標識的組件。
  3. JLabel的構造器容許指定初始文本和圖標,也能夠選擇內容的排列方式。能夠用Swing Constants接口中常量來指定排列方式。
  4. 包含HTML標籤的第一個組件須要延遲一段時間才能顯示出來,這是由於須要加載至關複雜的HTML顯示代碼。
  5. 標籤也能夠放置在容器中。
  6. java.swing.JLabel 1.2
    • JLabel(String text)
    • JLabel(Icon icon)
    • JLabel(String text,int align)
    • JLabel(String text,Icon icon,int align)
      構造一個標籤。
      參數:text 標籤中的文本,icon 標籤中的圖標,align 一個SwingConstants的常量LEFT(默認)、CENTER或 RIGHT。
    • String getText()
    • void setText(String text)
      獲取或設置標籤的文本。
    • Icon getIcon()
    • void setIcon(Icon icon)
      獲取或設置標籤的圖標。

9.3.3 密碼域

  1. 密碼域是一種特殊類型的文本域。爲了不有不良企圖的人看到密碼,用戶輸入的字符不顯示出來。每一個輸入的字符都有回顯字符(echo character)表示,典型的回顯字符是星號(*)。Swing提供了JPasswordField類來實現這樣的文本域。
  2. javax.swing.JPasswordField 1.2
    • JPasswordField(String text,int columns)
      構造一個新的密碼域對象。
    • void setEchoChar(char echo)
      爲密碼域設置回顯字符。注意:獨特的觀感能夠選擇本身的回顯字符。0表示從新設置爲默認的回顯字符。
    • char[] getPassword()
      返回密碼域中的文本。爲了安全起見,在使用以後應該覆寫返回的數組內容(密碼並非以String的形式返回,這是由於字符串在被垃圾回收器回收以前會一直駐留在虛擬機中)。

9.3.4 文本區

  1. 用戶並不受限於輸入執行的行數和列數。當輸入過長時,文本會滾動。
  2. 若是文本區的文本超出線束的範圍,那麼剩下的文本就會被裁減掉。能夠經過開啓換行特性來避免裁剪過長的行。

9.3.5 滾動窗格

  1. 在Swing中,文本區沒有滾動條。若是須要滾動條,能夠將文本區插入到滾動窗格(scroll pane)中。
  2. JTextArea組件只顯示無格式的文本,沒有特殊字體或者格式設置。若是想要顯示格式化文本(如HTML),就須要使用JEditorOane類。
  3. javax.swing.JTextArea 1.2
    • JTextArea()
    • JTextArea(int rows,int cols)
    • JTextArea(String text,int rows,int cols)
      構造一個新的文本對象。
    • void setColumns(int cols)
      設置文本區應該使用的首選列數。
    • void setRows(int rows)
      設置文本區應該使用的首選行數。
    • void append(String newText)
      將給定的文本追加到文本區中已有文本的尾部。
    • void setLineWrap(boolean wrap)
      打開或關閉換行。
    • void setWrapStyleWord(boolean word)
      若是word是true,超長的行會在自邊框處換行。若是爲false,超長的行被截斷而不考慮字邊框。
    • void setTabSize(int c)
      將製表符(tab stop)設置爲c列。注意,製表符不會被轉換爲空格,但可讓文本對齊到下一個製表符處。
  4. javax.swing.JScrollPane 1.2
    • JScrollPane(Component c)
      建立一個滾動窗格,用來顯示指定組件的內容。當組件內容超過顯示範圍時,滾動條會自動地出現。

9.4 選擇組件

9.4.1 複選框

  1. 複選框自動地帶有標識標籤。用戶經過點擊某個複選框來選擇相應的選項,再點擊則取消選取。當複選框得到焦點時,用戶也能夠經過按空格鍵來切換選擇。
  2. javax.swing.JCheckBox 1.2
    • JCheckBox(String label)
    • JCheckBox(String label,Icon icon)
      構造一個複選框,初始沒有被選擇。
    • JCheckBox(String label,boolean state)
      用給定的標籤和初始化狀態構造一個複選框。
    • boolean isSelected()
    • void setSelected(boolean state)
      獲取或設置複選框的選擇狀態。

9.4.2 單選按鈕

  1. 當用戶選擇另外一項的時候,前一項就自動地取消選擇。這樣一組選框一般稱爲單選按鈕組(Radio Button Group)。
  2. javax.swing.JRadioButton 1.2
    • JRadioButton(String label,Icon icon)
      構造一個單選按鈕,初始沒有被選擇。
    • JRadioButton(String label,boolean state)
      用給定的標籤和初始狀態構造一個單選按鈕。
  3. javax.swing.ButtonGroup 1.2
    • void add(AbstractButton b)
      將按鈕添加到組中。
    • ButtonModel getSelection()
      返回被選擇的按鈕的按鈕模型。
  4. javax.swing.ButtonModel 1.2
    • String getActionCommand()
      返回按鈕模型的動做命令。
  5. javax.swing.AbstractButton 1.2
    • void setActionCommand(String s)
      設置按鈕以及模型的動做命令。

9.4.3 邊框

  1. 若是在一個窗口中有多組單選按鈕,就須要用可視化的形式指明哪些按鈕屬於同一組。Swing提供了一組頗有用的邊框(borders)來解決這個問題。
    有幾種不一樣的邊框可供選擇。
    1)調用BorderFactory的靜態方法建立邊框。可選的分格:凹斜面、凸斜面、蝕刻、直線、蒙版。
    2)若是願意的話,能夠給邊框添加標題,具體的實現方法是將邊框傳遞給:BorderFactory.createTitledBorder。
    3)若是確實想把一切凸顯出來,能夠將幾種邊框組合起來使用:BorderFactory.createCompoundBorder。
    4)調用JComponent類中setBorder方法將結果邊框添加到組件中。
  2. 不一樣的邊框有不一樣的用於設置邊框的寬度和顏色的選項。
  3. javax.swing.BorderFactory 1.2
    • static Border createLineBorder(Color color)
    • static Border createLineBorder(Color color,int thickness)
      建立一個簡單的直線邊框。
    • static MatteBorder createMatteBorder(int top,int left,int bottom,int right,Color color)
    • static MatteBorder createMatteBorder(int top,int left,int bottom,int right,Icon tileIcon)
      建立一個用color顏色或一個重複(repeating)圖標填充的粗的邊框。
    • static Border createEmptyBorder()
    • static Border createEmptyBorder(int top,int left,int bottom,int right)
      建立一個空邊框。
    • static Border createEtchedBorder()
    • static Border createEtchedBorder(Color highlight,Color shadow)
    • static Border createEtcheBorder(int type)
    • static Border createEtchedBorder(int type,Color highlight,Color shadow)
      建立一個具備3D效果的直線邊框。
      參數:highlight,shadow 用於3D效果的顏色, type EtchedBorder.RAISED和EtchedBorder.LOWERED之一。
    • static Border createBevelBorder(int type)
    • static Border createBevelBorder(int type,Color highlight,Color shadow)
    • static Border createLoweredBevelBorder()
    • static Border createRaisedBevelBorder()
      建立一個具備凹面或凸面的邊框。
      參數:type BevelBorder.LOWERED和BevelBorder.RAISED之一。highlight,shadow 用於3D效果的顏色。
    • static TitledBorder createTitledBorder(String title)
    • static TitledBorder createTitledBorder(Border border)
    • static TitledBorder createTitledBorder(Border border,String title)
    • static TitledBorder createTitledBorder(Border border,String title,int justification,int position)
    • static TitledBorder createTitledBorder(Border border,String title,int justification,int position)
    • static TitledBorder createTitledBorder(Border border,String title,int justification,int position,Font font)
    • static TitledBorder createTitledBorder(Border border,String title,int justification,int position,Font font ,Color color)
      建立一個具備給定特性的帶標題的邊框。
      參數:title 標題字符串。border 用標題裝飾的邊框。 justification TitledBorder常量LEFT、CENTER、RIGHT、LEADING、trAILING或DEFAULT_JUSTIFICATION(left)之一。position TitledBorder常量ABOVE_TOP、TOP、BELOW_TOP、ABOVE_BOTTOM、BOTTOM、BELOW_BOTTOM或DEFAULT_POSITION(top)之一。font 標題的字體。color 標題的顏色。
    • static CompoundBorder createCompoundBorder(Border outSideBorder,Border indideBorder)
      將兩個邊框組合成一個新的邊框。
  4. javax.swing.border.SoftBevelBorder 1.2
    • SoftBevelBorder(int type)
    • SodtBevelBorder(int type,Color highliht,Color shadow)
      建立一個帶有柔和邊角的斜面邊框。
      參數:type BevelBorder.LOWERED和BevelBorder.RAISED之一。highlight,shadow 用於3D效果的顏色。
  5. javax.swing.border.LineBorder 1.2
    • public LineBorder(Color color,int thickness,boolean roundedCorners)
      用指定的顏色和粗細建立一個直線邊框。
  6. javax.swing.JComponent 1.2
    • void setBorder(Border border)
      設置這個組件的邊框。

9.4.4 組合框

  1. 若是下拉列表框被設置成可編輯(editable),就能夠像編輯文本同樣編輯當前的選項內容。鑑於這個緣由,這種組合被稱爲組合框(combo box),它將文本域的靈活性與一組預約義的選項組合起來。JComboBox類提供了組合框的組件。
  2. 調用setEditable方法可讓組合框可編輯。注意,編輯只會影響當前項,而不會改變列表內容。
  3. 能夠調用getSelectedItem方法獲取當前的選項,若是組和框是可編輯的,當前選項則是能夠編輯的。不過,對於可編輯組合框,其中的選項能夠是任何類型,這取決於編輯器。
  4. 當用戶從組合框中選擇一個選項時,組合框就將產生一個動做事件。爲了判斷哪一個選項被選擇,能夠經過事件參數調用getSource方法來獲得發送事件的組合框引用,接着調用getSelectedItem方法獲取當前選擇的選項。須要把這個方法的返回值轉化爲相應的類型,一般是String型。
  5. javax.swing.JComboBox 1.2
    • boolean isEditable()
    • void setEditable(boolean b)
      獲取或設置組合框的可編輯特性。
    • void addItem(Object item)
      把一個選項添加到選項列表中。
    • void insertItemAt(Object item,int index)
      將一個選項添加到選項列表的指定位置。
    • void removeItem(Object item)
      從選項列表中刪除一個選項。
    • void removeItemAt(int index)
      刪除指定位置的選項。
    • void removeAllItems()
      從選項列表中刪除全部選項。
    • Object getSelectedItem()
      返回當前選擇的選項。

9.4.5 滑動條

  1. 組合框可讓用戶從一組離散值中進行選擇。滑動條容許進行連續值得選擇。
  2. 當用戶滑動滑動條時,滑動條的值就會在最小值和最大值之間變化。當值發生變化時,ChangeEvent就會發送給全部變化的監聽器。爲了獲得這些改變的通知,須要條用addChangeListener方法而且安裝一個實現了ChangeListener接口的對象。這個接口只有一個方法StateChanged。在這個方法中,能夠獲取滑動條的當前值。
  3. 能夠經過顯示標尺(tick)對滑動條進行修飾。
  4. 能夠經過下列方法爲達標吃添加標尺標記標籤(tick mark labels):slider.setPaintLabels(true);
  5. 若是標尺的標記或者標籤不顯示,請檢查一下是否調用了setPaintTicks(true)和setPaintLabels(true)。
  6. 要想影藏滑動條移動的軌跡,能夠調用:slider.setPaintTrack(false)
  7. javax.swing.JSlider 1.2
    • JSlider()
    • JSlider(int direction)
    • JSlider(int min,int max)
    • JSlider(int min,int max,int initialValue)
    • JSlider(int direction,int min,int max,int initialValue)
      用給定的方向、最大值、最小值和初始化值構造一個水平滑動條。
      參數:direction SwingConstants.HORIZONTAL或SwingConstants.VERTICAL之一。默認爲水平。 mi,max 滑動條的最大值、最小值。默認值爲0到100。 initialValue 滑動套的初始化值。默認值爲50。
    • void setPaintTicks(boolean b)
      若是b爲true,顯示標尺。
    • void setMajorTickSpacing(int units)
    • void setMinorTickSpacing(int units)
      用給定的滑動條單位的倍數設置大標尺和小標尺。
    • void setPaintLabels(boolean b)
      若是b是true,顯示標尺標籤。
    • void setLabelTable(Dictionary table)
      設置用於做爲標尺標籤的組件。表中的每個鍵/值對都採用new Integer(value)/component的格式。
    • void setSnapToTicks(boolean b)
      若是b是true,每一次調整後滑塊都要對齊到最接近的標尺處。
    • void setPaintTrack(boolean b)
      若是b是true,顯示滑動條滑動的軌跡。

9.5 菜單

  1. 位於窗口頂部的菜單欄(menu bar)包括了下拉菜單的名字。點擊一個名字就能夠打開包含菜單項(menu items)和子菜單(submenus)的菜單。當用戶點擊菜單項時,全部的菜單都會被關閉而且將一條消息發送給程序。

9.5.1 菜單建立

  1. 在一般狀況下,菜單項觸發的命令也能夠經過其餘用戶界面元素(如工具欄上的按鈕)激活。
  2. javax.swing.JMenu
    • JMenu(String labe)
      用給定標籤構造一個菜單。
    • JMenuItem add(JMenuItem item)
      添加一個菜單項(或一個菜單)。
    • JMenuItem add(String label)
      用給定標籤將一個菜單項添加到菜單中,並返回這個菜單項。
    • JMenuItem add(Action a)
      用給定動做將一個菜單項添加到菜單中,並返回這個菜單項。
    • void addSeparator()
      將一個分隔符行(separator line)添加到菜單中。
    • JMenuItem insert(JMenuItem menu,int index)
      將一個新菜單項(或子菜單)添加到菜單的指定位置。
    • JMenuItem insert(JMenuItem menu,int index)
      將一個新菜單項(或子菜單)添加到菜單的指定位置。
    • JMenuItem insert(Action a,int index)
      用給定動做在菜單的指定位置添加一個新菜單項。
    • void insertSeparator(int index)
      將一個分隔符添加到菜單中。
      參數:index 添加分隔符的位置。
    • void remove(int index)
    • void remove(JMenuItem item)
      從菜單中刪除指定的菜單項。
  3. javax.swing.JMenuItem 1.2
    • JMenuItem(String label)
      用給定標籤構造一個菜單項。
    • JMenuItem(Acton a) 1.3
      爲給定動做構造一個菜單項。
  4. javax.swing.AbstractButton 1.2
    • void setAction(Action a) 1.3
      爲這個按鈕或菜單項設置動做。
  5. javax.swing.JFrame 1.2
    • void setJMenuBar(JMenuBar menubar)
      爲這個框架設置菜單欄。

9.5.2 菜單項中的圖標

  1. JMenuItem類擴展了AbstractButton類。與按鈕同樣,菜單能夠包含文本標籤、圖標,也能夠二者都包含。既能夠利用JMenuItem(String,Icon)或者JMenuItem(Icon)構造器爲菜單指定一個圖標,也能夠利用JmenuItem類中的setIcon方法(繼承自AbstractButton類)指定一個圖標。
  2. javax.swing.JMenuItem 1.2
    • JMenuItem(String label,Icon icon)
      用給定的標籤和圖標構造一個菜單項。
  3. javax.swing.AbstractButton 1.2
    • void setHorizontalTextPosition(int pos)
      設置文本對應圖標的水平位置。
      參數:pos SwingConstants.RIGHT(文本在圖標的右側)或SwingConstants.LEFT。
  4. javax.swing.AbstractAction 1.2
    • AbstractAction(String name,Icon smallIcon)
      用給定的名字和圖標構造一個抽象的動做。

9.5.3 複選框和單選按鈕菜單項

  1. 複選框和單選按鈕菜單項在文本旁邊顯示了一個複選框或一個單選按鈕。當用戶選擇一個菜單框時,菜單項就會自動地在選擇和未選擇間進行切換。
  2. javax.swing.JCheckBoxMenuItem 1.2
    • JCheckBoxMenuItem(String label)
      用給定的標籤構造一個複選框菜單項。
    • JCheckBoxMenuItem(String label,boolean state)
      用給定的標籤個給定的初始狀態(true爲選定)構造一個複選框菜單。
  3. javax.swing.JRadioButtonMenuItem 1.2
    • JRadioButtonMenuItem(String label)
      用給定的標籤構造一個單選按鈕菜單項。
    • JRadioButtonMenuItem(String label,boolean state)
      用給定的標籤和給定的初始狀態(true爲選定)構造一個單選按鈕菜單項。
  4. javax.swing.AbstractButton 1.2
    • boolean isSelected()
    • void setSelected(boolean state)
      獲取或設置這個菜單項的選擇狀態(true爲選定)。

9.5.4 彈出菜單

  1. 彈出菜單(pop-up menu)是不固定在菜單欄中隨處浮動的菜單。
  2. 一般,當用戶點擊某個鼠標鍵時彈出菜單。這就是所謂的彈出式觸發器(pop-up trigger)。在Window或者Linux中,彈出式觸發器是鼠標右鍵。
  3. javax.swing.JPopupMenu 1.2
    • void show(Component c,int x,int y)
      顯示一個彈出菜單。
      參數:c 顯示彈出菜單的組件。 x,y 彈出菜單左上角的座標(c的座標空間內)。
    • boolean isPopupTrigger(MouseEvent event) 1.3
      若是鼠標事件是彈出菜單觸發器,則返回true。
  4. java.awt.event.MouseEvent 1.1
    • boolean isPopupTrigger()
      若是鼠標事件是彈出菜單觸發器,則返回true。
  5. javax.swing.JComponent 1.2
    • JPopupMenu getComponentPopupMenu() 5.0
    • void setComponentPopupMenu(JPopupMenu popup)
      獲取或設置用於這個組件的彈出菜單。
    • boolean getInheritsPopupMenu() 5.0
    • void setInheritsPopupMenu(boolean b) 5.0
      獲取或設置inheritsPopupMenu特性。若是這個特性被設置或這個組件的彈出菜單爲null,則應用上一級彈出菜單。

9.5.5 快捷鍵和加速器

  1. 能夠經過在菜單項的構造器中指定一個快捷字母來爲菜單項設置快捷鍵。
  2. 快捷鍵會自動地顯示在菜單項中,並帶有一條下劃線。
  3. 在Java SE 1.4中,能夠調用setDiaplayedMnemonicIndex方法指定但願加下劃線的字符。
  4. 若是有一個Action對象,就能夠把快捷鍵做爲Action.MNEMONIC_KEY的鍵值添加到對象中。
  5. 只能在菜單項的構造器中設定快捷鍵祖母,而不是在菜單構造器中。若是想爲菜單設置快捷鍵,須要調用setMnemonic方法。
  6. 能夠同時按下ALT鍵和菜單的快捷鍵來實如今菜單欄中選擇一個頂層菜單的操做。
  7. 可使用快捷鍵從當前打開的菜單中選擇一個子菜單或者菜單項。而加速器是在不打開菜單的狀況下選擇菜單項的快捷鍵。
  8. 當用戶按下加速器組合鍵時,就會自動地選擇相應的菜單項,同時激活一個動做事件,這與手動地選擇這個菜單項同樣。
  9. 加速器只能關聯到菜單項上,不能關聯到菜單上。加速器鍵並不實際打開菜單。它將直接地激活菜單關聯的動做事件。
  10. javax.swing.HMenuItem 1.2
    • JMenuItem(String label, int mnemonic)
      用給定的標籤和快捷鍵字符構成一個菜單項。
      參數:label 菜單項的標籤。 mnemonic 菜單項的快捷鍵字符,在標籤中這個字符下面會有一個下劃線。
    • void setAccelerator(KeyStroke k)
      將k設置爲這個菜單項的加速器。加速器顯示在標籤的旁邊。
  11. javax.swing.AbstractButton 1.2
    • void setMnemonic(int mnemonic)
      設置按鈕的快捷字符。該字符會在標籤中如下劃線的形式顯示。
    • void setDisplayedMnemonicIndex(int index) 1.4
      將按鈕文本中的index字符設定爲帶下劃線。若是不但願第一個出現的快捷鍵字符帶下劃線,就可使用這個方法。

9.5.6 啓用和禁用菜單項

  1. 啓動和禁用菜單項有兩種策略。每次環境發生變化就對相關的菜單項或動做調用setEnabled。另外一種方式是在現實菜單以前禁用這些菜單欄。
  2. javax.swing.JMenuItem 1.2
    • void setEnabled(boolean b)
      啓用或禁用菜單項。
  3. javax.swing.event.MenuListener 1.2
    • void menuSelected(MenuEvent e)
      在菜單被選擇但還沒有打開以前調用。
    • void menuDeselected(MenuEvent e)
      在菜單被取消選擇而且已經關閉以後被調用。
    • void menuCanceled(MenuEvent e)
      當菜單被取消時被調用。例如,用戶單擊菜單之外的區域。

9.5.7 工具欄

  1. 工具欄是在程序中提供的快速訪問經常使用命令的按鈕欄。
  2. 工具欄的特殊之處在於能夠將它隨處移動。能夠將它拖拽到框架的四個邊框上。
  3. 工具欄只有位於採用邊框佈局或者任何支持North、East、South和Weat約束佈局管理器的容器內纔可以被拖拽。
  4. 工具欄能夠徹底脫離框架。這樣的工具欄將包含在本身的框架中。當關閉包含工具欄的框架時,它會回到原始的框架中。

9.5.8 工具提示

  1. 當光標停留在某個按鈕上片刻時,工具提示就會被激活。工具提示文本顯示在一個有顏色的矩形裏。當用戶移開鼠標時,工具提示就會自動地消失。
  2. javax.swing.JToolBar 1.2
    • JToolBar()
    • JToolBar(String titleString)
    • JToolBar(int orientation)
    • JToolBar(String titleString,int orientation)
      用給定的標題字符串和方向構造一個工具欄。Orientation能夠是SwingConstants.HORIZONTAL(默認)或SwingConstants.VERTICAL。
    • JButton add(Action a)
      用給定的動做名、圖標、簡要的說明和動做回調構造一個工具欄中的新按鈕。
    • void addSeparator()
      將一個分隔符添加到工具欄的尾部。
  3. javax.swing.JComponent 1.2
    • void setToolTipText(String text)
      設置當鼠標停留在組件上時顯示在工具提示中的文本。

9.6 複雜的佈局管理

  1. Java佈局管理器是一種用於組件佈局的好方法。應用佈局管理器,佈局就可使用組件間關係的指令來完成佈局操做。

9.6.1 網格組佈局

  1. 網格足佈局是全部佈局管理器之母。能夠將網格組佈局當作是沒有任何限制的網格佈局。在網格組佈局中,行和列的尺寸能夠改變。能夠將相鄰的單元合併以適應較大的組件(不少字處理器以及HTML都利用這個功能編輯表格:一旦須要就合併相鄰的單元格)。組件不須要填充這個單元格區域,並能夠指定它們在單元格內的對齊方式。
  2. 要想使用網格組管理器進行佈局,必須通過下列過程:
  • 創建一個GridBagLayout的對象。不須要指定網格的行數和列數。佈局管理器會根據後面所給的信息猜想出來。
  • 將GridBagLayout對象設置成組件的佈局管理器。
  • 爲每一個組件創建一個GridBagConstraints對象。設置GridBagConstraints對象的域以便指出組件在網格組中的佈局方案。
  • 最後,經過下面的調用添加組件的約束:add(component,constraints);
  1. GridBagConstraints對象的幾個最重要的約束
    (1)gridx、girdy、gridwidth和gridheight參數
    這些約束定義了組件在網格中的位置。gridx和girdy指定了被添加組件左上角的行、列位置。gridwidth和gridheight制定了組件佔據的行數和列數。
    (2)增量域
    在網格佈局中,須要爲每一個區域設置增量域(weightx和weighty)。若是將增量設置爲0,則這個區域將永遠爲初始尺寸。若是將全部區域的增量都設置爲0,容器就會集聚在爲它分配的區域中間,而不是經過拉伸來填充它。
    從概念上講,增量參數屬於行和列的屬性,而不屬於某個單獨的單元格。但卻須要在單元格上指定它們,這是由於網格組佈局並不暴露行和列。行和列的增量等於每行或每列單元格的增量最大值。所以,若是想讓一行或一列的大小保持不變,就須要將這行、這列的全部組件的增量都設置爲0。
    注意,增量並不實際給出列的相對大小。當容器超過首選大小時,增量表示分配給每一個區域的擴展比例值。
    (3)fill和anchor參數
    若是不但願組件拉伸至整個區域,就須要設置fill約束。它有四個有效值:GridBagConstraints.NONE、GridBagConstraints.HORIZONTAL、GridBagConstraints.VERTICAL和GridBagConstraints.BOTH。
    (4)填充
    能夠經過設置GridBagLayout的insets域在組件周圍增長附件的空白區域。經過設置Insets對象的left、top、right和bottom指定組件周圍的空間量。這被稱爲外部填充(或外邊距)(external padding)。
    經過設置ipadx和ipady指定內部填充(或內外距)(internal padding)。這兩個值被加到組件的最小寬度和最小高度上。這樣能夠保證組件不會收縮至最小尺寸之下。
    (5)指定gridx,gridy,gridwidth和gridheight參數的另外一種方法
    須要經過爲gridheight和gridwidth域指定一個適當的值來設置組件橫跨的行數和列數。除此以外,若是組件擴展至最後一行或最後一列,則不要給出一個實際的數值,而是用常量GridBagConstraints.REMAINDER替代,這樣會告訴佈局管理器這個組件時本行上的最後一個組件。
    (6)使用幫助類來管理(tame)網格組約束
  2. java.awt.GridBagConstraints 1.0
    • int girdx,girdy
      指定單元格的起始行和列。默認值爲0.
      • int gridwidth,girdheight
        指定單元格的行和列的範圍。默認值爲1.
    • double weightx,weighty
      指定單元格擴大時的容量。默認值爲0.
    • int anchor
      表示組件在單元格內的對齊方式。能夠選擇的絕對位置有:NORTHWEAT、NORTH、NORTHEAST、WEST、CENTER、EAST、SOUTHWEST、SOUTH、SPUTHEAS。或者各個方向上的相對位置:FIRST_LINE_START、LINE_START、FIRST_LINE_END、PAUSE_START、CENTER、PAGE_END、LAST_LINE_START、LINE_END、LAST_LINE_END。若是應用程序有可能從右向左,或者自頂至底排列文本,就應該使用後者。默認值爲CENTER。
    • int fill
      指定組件在單元格內的填充行爲,取值爲NONE、BOTH、HORIZONTAL,或者VERTICAL。默認值爲NONE。
    • int ipadx,ipady
      指定組件周圍的「內部」填充。默認值爲0。
    • Insets insets
      指定組件邊框周圍的「外部」填充。默認爲不填充。
    • GridBagConstraints(int gridx,int gridy,int girdwidth,int gridheight,double weightx,double weighty,int anchor,int fill,Insets insets,int ipadx,int ipady) 1.2
      用參數中給定的多有域值構造GridBagConstains。Sun建議這個構造器只用在自動代碼生成器只用在自動生成器中,由於它會使得代碼很是難於閱讀。

9.6.2 組佈局

  1. javax.swing.GroupLayout 6
    • GroupLayout(Container host)
      構造一個GroupLayout對象,用於佈局host容器中的組件(注意:host容器仍然須要調用setLayout)。
    • void setHorizontalGroup(GroupLayout.Group g)
    • void setVerticalGroup(GroupLayout.Group g)
      設置用於控制水平或垂直容器的組。
    • void linkSize(Component… components)
    • void linkSize(int axis,Component… components)
      強制給定的幾個組件具備相同的尺寸,或者在指定的座標軸上有相同的尺寸(SwingConstants.HORIZONTAL或者SwingContants.VERTICAL)。
    • GroupLayout.SequentialGroup createSequentialGroup()
      建立一個組,用於並行地佈局子組件。
    • GroupLayout.ParallelGroup createParallelGroup()
    • GroupLayout.ParallerGroup createParallerGroup(GroupLayout.Alignment align)
    • GroupLayout.ParallelGroup createParallelGroup(GroupLayout.Alignment align,boolean resizable)
      建立一個組,用於並行地佈局子組件。
      參數:align BASELINE、LEADING(默認值)、TRAILING或CENTER。resizable 若是組能夠調整大小,這個值爲true(默認值);若是首選的尺寸是最小尺寸或最大尺寸,這個值爲false。
    • boolean getHonorsvisibility()
    • void setHonorsvisibility(boolean b)
      獲取或設置honorsVisibility特性。當這個值爲true(默認值)時,不可見的組件不參與佈局。當這個值爲false時,好像可見的組件同樣,這些組件也參與佈局。這個特性主要用於想要臨時影藏一些組件,而又不但願改變佈局的狀況。
    • boolean getAutoCreateCaps()
    • void setAutoCreateaps(boolean b)
    • boolean getAutoCreateContainerCaps()
    • void setAutoCreateContainerCaps(boolean b)
      獲取或設置autoCreateCaps和autoCreateContainerCaps特性。當這個值爲true時,將自動地在組件或容器邊框之間添加空隙。默認值是false。在手工地構造GroupLayout時,true值頗有用。
  2. javax.swing.GroupLayout.Group
    • GroupLayout.Group addComponent(Component c)
    • GroupLayout.Group addComponent(Component c,int minimumSize,int preferredSize,int maximumSize)
      添加一個組件至本組中。尺寸參數能夠是一個實際值(非負值),或者是一個特定的常量GroupLayout.DEFAULT_SIZE或GroupLayout.PREFERRED_SIZE。當使用DEFAULT_SIZE,將調用組件的getMinimumSize、getPreferredSize或getMaximumSize。當使用PREFERRED_SIZE時,將調用組件的getPreferredSize方法。
    • GroupLayout.Group addCap(int size)
    • GroupLayout.Group addCap(int minimumSize,int preferredSize,int maximumSize)
      添加一個固定的或可調節的空隙。
    • GroupLayout.Group addGroup(GroupLayout.Group g)
      將一個給定的組添加到本組中。
  3. javax.swing.GroupLayout.ParallelGroup
    • GroupLayout.ParallelGroup addComponent(Component c,GroupLayout.Alignment align)
    • GroupLayout.ParallelGroup addComponent(Component c,GroupLayout.Alignment align,int minimumSize,int preferredSize,int maximumSize)
    • GroupLayout.ParallelGroup addGroup(GroupLayout.Group g,GroupLayout.Alignment align)
      利用給定的對齊方式(BASELINE、LEADING、TRAILINC或CENTER)添加一個組件或組至本組中。
  4. javax.swing.GroupLayout.SequentialGroup
    • GroupLayout.SequentialGroup addContainerCap()
    • GroupLayout.SequentialGroup addContainerCap(int preferredSize,int maximumSize)
      爲分割組件和容器的邊緣添加一個間隙。
    • GroupLayout.SequentialGroup addPreferredCap(LayoutStyle.ComponentPlacement type)
      爲分隔組件添加一個間隙。間隙的類型是LayoutStyle.ComponentPlacement.RELATED或LayoutStyle.ComponentPlacement。

9.6.3 不使用佈局管理器

  1. 下面是將一個組件定位到某個絕對定位的步驟:
    (1)將佈局管理器設置爲null。
    (2)將組件添加到容器中。
    (3)指定想要放置的位置和大小。
  2. java.awt.Component 1.0
    • void setBounds(int x,int y,int edth,int height)
      移動並調整組件的尺寸。
      參數:x,y 組件新的左上角位置。width,height 組件新的尺寸。

9.6.4 定製佈局管理器

  1. 定製佈局管理器必須實現LayoutManager接口,而且須要覆蓋下面5個方法:void addLayoutComponent(String s,Component c);,void removeLayout(Component c);,Dimension preferredLayoutSize(Container parent);Dimension minimumLayoutSize(Container parent)void layoutContainer(Container parent)
    在添加或刪除一個組件時會抵用前面兩個方法。若是不須要保存組件的任何附加信息,那麼可讓這兩個方法什麼都不作。接下來的兩個方法計算組件的最小布局和首選佈局所須要的空間。二者一般相等。第5個方法真正地實施操做,它調用全部組件的setBounds方法。
  2. java.awt.LayoutManager 1.0
    • void addLayoutComponent(String name,Component cmp)
      將組件添加到佈局中。
      參數:name 組件位置的標識符。 comp 被添加的組件。
    • void removeLayoutComponent(Component comp)
      從本佈局中刪除一個組件。
    • Dimension preferredLayoutSize(Container cont)
      返回本佈局下的容器的首選尺寸。
    • Dimension minimumLayoutSize(Container cont)
      返回本佈局中下容器的最小尺寸。
    • void layoutContainer(Container cont)
      擺放容器內的組件。

9.6.5 遍歷順序

  1. 當把不少組件添加到窗口中時,須要考慮遍歷順序(traversal order)的問題。
  2. 調用compnent.setFocusable(false);能夠從焦點遍歷中刪除一個組件。這對於不接受鍵盤輸入、自行繪製的組件頗有用。

9.7 對話框

  1. 與大多數的窗口系統同樣,AWT也分爲模式對話框和無模式對話框。所謂模式對話框是指在結束對它的處理以前,不容許用戶與應用程序的其他窗口進行交互。模式對話框主要用於在程序繼續運行以前獲取用戶提供的信息。
    所謂無模式對話框是指容許用戶同時在對話框和應用程序的其餘窗口中輸入信息。使用無模式對話框的最好例子就是工具欄。工具欄能夠停靠在任何地方,而且用戶能夠在須要的時候,同時與應用程序窗口和工具欄進行交互。
  2. Swing有一個很容易使用的類JOptionPane,它能夠彈出一個簡單的對話框,而沒必要編寫任何對話框的相關代碼。

9.7.1 選項對話框

  1. Swing有一套簡單的對話框,用於獲取用戶的一些簡單信息。JOptionPane有4個用於顯示這些對話框的靜態方法:
    showMessageDialog:顯示一條消息並等待用戶點擊OK
    showConfirmDialog:顯示一條消息並等待用戶確認(與OK/Cancel相似)
    showOptionDialog:顯示一條消息並得到用戶在一組選項中的選擇
    showInputDialog:顯示一條消息並得到用戶輸入的一行文本
  2. 輸入對話框有一個用於接收用戶輸入的額外組件。它既多是用於輸入任何字符串的文本域,也多是容許用戶從中選擇的組合框。
  3. 這些對話框的確切佈局和爲標準消息類型選擇的圖標都取決於具體的觀感。
  4. 每一個對話框類型都有一個方法,能夠用來提供本身的圖標,以替代原來的圖標。
  5. 能夠爲每一個對話框類型指定一條消息。這的消息既能夠是字符串、圖標、用戶界面組件,也能夠是其餘類型的對象。下面是顯示消息對象的基本方法:
    String: 繪製字符串
    Icon: 顯示圖標
    Component: 顯示組件
    Object[]: 顯示數組中的全部對象,一次疊加
    任何其餘對象: 調用toString方法來顯示結果字符串
  6. 惟一底部的按鈕取決於對話框類型和選項類型。當調用showMessageDialog和showInputDailog時,只能看到一組標準按鈕(分別是OK/Cancel)。當調用showConfirmDialog時,能夠選擇下面四種選項類型之一:DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION。
  7. 使用showOptionDialog能夠指定任意的選項。這裏須要爲選項提供一個對象數組。每一個數組元素能夠是下列類型之一:
    String:使用字符串標籤建立一個按鈕
    Icon:使用圖標建立一個按鈕
    Component:顯示這個組件
    其餘類型的對象:使用toString方法,而後用結果字符串做爲標籤建立按鈕。
  8. 這些方法的返回值:
    showMessageDialog 無
    showConfirmDialog 表示被選項的一個整數
    showOptionDialog 表示被選項的一個整數
    showInputDialog 用戶選擇或輸入的字符串
    showConfirmDialog和showOptionDialog返回一個整數用來表示用戶選擇了哪一個按鈕。對於選項對話框來講,這個值就是被選的選項的索引值或者是CLOSED_OPTION(此時用戶沒有選擇可選項,而是關閉了對話框),對於確認對話框,返回值能夠是下列值之一:OK_OPTION、CANCEL_OPTION、YES_OPTION、NO_OPTION、CLOSED_OPTION。
  9. 消息字符串中能夠包含換行符(’\n’)。這樣就可讓字符串多行顯示。
  10. javax.swing.JOptionPane 1.2
    • static void showMessageDialog(Component parent,Object message,String title,int messageType,Icon icon)
    • static void showMessageDialog(Component parent,Object message,String title,int messageType)
    • static void showMessageDialog(Component parent,Object message)
    • static void showInternalMessageDialog(Component parent,Object message,String title,int messageType,Icon icon)
    • static void showInternalMessageDialog(Component parent,Object message,String title,int messageType)
    • static void showInternalMessageDialog(Component parent,Object message)
      顯示一個消息對話框或者一個內部消息對話框(內部對話框徹底顯示在所在的框架內)。
      參數:parent 父組件(能夠爲null)。 message 顯示在對話框中的消息(能夠是字符串、圖標、組件或者一個這些類型的數組)。title 對話框標題欄中的字符串。messageType 取值爲ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE之一。icon 用於替代標準圖標的圖標。
    • static int showConfirmDialog(Component parent,Object message,String title,int optionType,int messageType,Icon icon)
    • static int showConfirmDialog(Component parent,Object message,String title,int optionType,int messageType)
    • static int showConfirmDialog(Component parent,Object message,String title,int optionType)
    • static int showConfirmDialog(Component parent,Object message)
    • static int showInternalConfirmDialog(Component parent,Object message,String title,int optionType,int messageType,Icon icon)
    • static int showInternalConfirmDialog(Cmponent parent,Object message,String title,int optionType,int messageType)
    • static int showInternalConfirmDialog(Component parent,Object message,String title,int optionType)
    • static int showInternalConfirmDialog(Component parent,Object message)
      顯示一個確認對話框或者內部確認對話框(內部對話框徹底顯示在所在的框架內)。返回用戶選擇的選項(取值爲OK_OPTION,CANCEL_OPTION,YES_OPTION,NO_OPTION0);若是用戶關閉對話框將返回CLOSED_OPTION。
      參數:parent 父組件(能夠爲null)。 message 顯示在對話框中的消息(能夠是字符串、圖標、組件或者一個這些類型的數組)。 title 對話框標題欄中的字符串。 messageType 取值爲ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAN_MESSAGE之一。optionType 取值爲DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION之一。icon 用於替代標準圖標的圖標。
    • static int showOptionDialog(Component parent,Object message,String title,int optionType,int messageType,Icon icon,Object[] options,Object default)
    • static int showInternalOptionDialog(Component parent,Object message,String title,int optionType,int messageType,Icon icon,Object[] options,Object default)
      顯示一個選項對話框或者內部選項對話框(內部對話框徹底顯示在所在的框架內)。返回用戶選擇的選項索引;若是用戶取消對話框返回CLOSED_OPTION。
      參數:parent 父組件(能夠爲null)。message 顯示在對話框中的消息(能夠是字符串,圖標,組件或者一個這些類型的數組)。title 對話框標題欄中的字符串。messageType 取值爲ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE之一。optionType 取值爲DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION之一。icon 用來替代標準圖標的圖標。options 一組選項(能夠是字符串、圖標或者組件)。default 呈現給用戶的默認值。
    • static Object showInputDialog(Component parent,Object message,String title,int messageType,Icon icon,Object[] values,Object default)
    • static String showInputDialog(Component parent,Object message,String title,int messageType)
    • static String showInputDialog(Component parent,Object message)
    • static String showInputDialog(object message)
    • static String showInputDialog(Component parent,Object message,Object default) 1.4
    • static String showInputDialog(Object message,Object default) 1.4
    • static String showInternalInputDialog(Component parent,Object message,String title,int messageType,Icon icon,Object[] values,Object default)
    • static Strng showInternalInputDialog(Component parent,Object message,String title,int messageType)
    • static String showInternalInputDialog(Component parent,Object message)
      顯示一個輸入對話框或者內部輸入對話框(內部對話框徹底顯示在所在的框架內)。返回用戶輸入的字符串;若是用戶取消對話框返回null。
      參數:parent 父組件(能夠爲null)。message 顯示在對話框中的消息(能夠是字符串、圖標、組件或者一個這些類型的數組)。title 對話框標題欄中的字符串。 messageType 取值爲ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAI_MESSAGE之一。icon 用於替代標準圖標的圖標。values 在組合框中顯示的一組值。default 呈現給用戶的默認值。

9.7.2 建立對話框

  1. 要想建立一個對話框,須要從JDialog派生一個類。具體過程以下:
    (1)在對話框構造器中,調用超類JDialog的構造器。
    (2)添加對話框的用戶界面組件。
    (3)添加事件處理器。
    (4)設置對話框的大小。
  2. 在調用超類構造器時,須要提供擁有者框架(owner frame)、對話框標題及模式特徵。
  3. 擁有者框架控制對話框的顯示位置,若是將擁有者標識爲null,那麼對話框將由一個隱藏框架所擁有。
  4. 模式特徵將指定對話框處於顯示狀態時,應用程序中其餘窗口是否被鎖住。無模式對話框不會鎖住其餘窗口,而有模式對話框將鎖住應用程序中的全部其餘窗口(除對話框的子窗口外)。用戶常用的工具欄就是無模式對話框,另外一方面,若是想強迫用戶在繼續操做以前提供一些必要的信息就應該使用模式對話框。
  5. javax.swing.JDialog 1.2
    • public JDialog(Frame parent,String title,boolean modal)
      構造一個對話框。在沒有明確地讓對話框顯示以前,它是不可見的。
      參數:parent 對話框擁有者的框架。 title 對話框的標題。 modal True表明模式對話框(模式對話框阻塞其餘窗口的輸入)。

9.7.3 數據交換

  1. 不少對話框都有默認按鈕。若是用戶按下一個觸發器鍵就自動地選擇了它。默認按鈕一般用加粗的輪廓給予特別的標識。
  2. javax.swing.SwingUtilities 1.2
    • Container getAncestorOfClass(Clas c,Component comp)
      返回給定組件的最早的父容器。這個組件屬於給定的類或者其子類之一。
  3. javax.swing/JComponent 1.2
    • JRootPane getRootPane()
      得到最靠近這個組件的根窗格,若是這個組件的祖先沒有根窗格返回null。
  4. javax.swing.JRootPane 1.2
    • void setDefaultButton(JButton button)
      設置根窗格的默認按鈕。要想禁用默認按鈕,須要將參數設置爲null。
  5. javax.swing.JButton 1.2
    • boolean isDefaultButton()
      若是這個按鈕是它的根窗格的默認按鈕,返回true。

9.7.4 文件對話框

  1. Swing中提供了JFileChooser類,它能夠顯示一個文本對話框,其外觀與本地應用程序中使用的文件對話框基本同樣。JFileChooser是一個模式對話框。注意,JFileChooser類並非JDialog類的子類。須要調用showOpenDialog,而不是調用setVisible(true)顯示打開文件的對話框,或者調用showSaveDialog顯示保存文件的對話框。接收文件的按鈕被自動地標籤爲Open或者Save。也能夠調用sowDialog方法爲按鈕設定標籤。
  2. 創建文件對話框而且獲取用戶選擇信息的步驟:
    (1)創建一個JFileChooser對象。與JDialog類的構造器不一樣,它不須要指定父組件。容許在多個框架中重用一個文件選擇器。
    (2)調用setCurrentDirectory方法設置當前目錄。
    (3)若是有一個想要做爲用戶選擇的默認文件名,可使用setSelectedFile方法進行指定。
    (4)若是容許用戶在對話框中選擇多個文件,須要調用setMultiSelectionEnabled方法。固然,這是可選的。
    (5)若是想讓對話框僅顯示某一種類型的文件,西藥設置文件過濾器。
    (6)在默認狀況下,用戶在文件選擇器中只能選擇文件。若是但願選擇目錄,須要調用setFileSelectionMode方法。參數值爲:JFileChooser.FILES_ONLY(默認值),JFileChooser.DIRECTORIES_ONLY或者JFileChooser.FILES_AND_DIRECTORIES。
    (7)調用showOpenDialog或者showSaveDialog方法顯示對話框。
    (8)調用getSelectedFile()或者getSelectedFiles()方法獲取用戶選擇的一個或多個文件。這些方法將返回一個文件對象或者一組文件對象。若是須要知道文件對象名時,能夠調用getPath方法。
  3. 若想限制顯示的文件,須要建立一個實現了抽象類javax.swing.filechooser.FileFilter的對象。文件選擇器將每一個文件傳遞給文件過濾器,只有文件過濾器接受的文件才被最終顯示出來。
  4. 用戶能夠從文件對話框底部的組合框中選擇過濾器。在默認狀況下,All File過濾器老是顯示在組合框中。若是想禁用All files過濾器,須要調用:chooser.setAcceptAllFileFilterUsed(false)
  5. 若是爲加載和保存不一樣類型的文件重用一個文件選擇器,就須要調用:chooser.resetChoosablefILTERS(),這樣能夠在添加新文件過濾器以前清除舊文件過濾器。
  6. 能夠經過爲文件選擇器顯示的每一個文件提供特定的圖標和文件描述來定製文件選擇器。者須要應用一個擴展於javax.swing.fileChooser包中的FileView類的對象。在一般狀況下,不須要提供文件視圖-可插觀感會提供。然而,若是想讓某種特定的文件類型顯示不一樣的圖標,就須要安裝本身的文件視圖。這要擴展FileView並實現下面5個方法:Icon getIcon(File f);、String getName(File f);、String getDescription(File f);、String getTypeDescription(File f);、Boolean isTraversable(File f);,而後,調用setFileView方法將文件視圖安裝到文件選擇器中。
  7. 文件選擇器爲每一個但願顯示的文件或目錄調用這些方法。若是方法返回的圖標、名字或描述信息爲null,那麼文件選擇器將會構造當前觀感的默認文件視圖。這樣處理很好,器援用是這樣只須要處理具備不一樣顯示的文件類型。
  8. 文件選擇器調用isTravesable方法來決定是否在用戶點擊一個目錄的時候打開這個目錄。
  9. javax.swing.JFileChooser 1.2
    • JFileChooser()
      建立一個可用於多框架的文件選擇器對話框。
    • void setCurrentDirectory(File file)
      設置文件對話框的初始目錄。
    • void setSelectedFile(File file)
    • void setSelectedFiles(File[] file)
      設置文件對話框的默認文件選擇。
    • void setMultiSelectionEnabled(boolean b)
      設置或清除多選模式。
    • void setFileSelectionMode(int mode)
      設置用戶選擇模式,只能夠選擇文件(默認),只能夠選擇目錄,或者文件和目錄都可以選擇。mode參數的取值能夠是JFileChooser.FILES_ONLY、JFileChooser.DIRECTORIES_ONLY和JFileChooser.FILES_AND_DIRECTORIES之一。
    • int showOpenDialog(Component parent)
    • int showSaveDialog(Component parent)
    • int showDialog(Component parent,String approveButtonText)
      顯示按鈕標籤爲Open,Save或者approveButtonText字符串的對話框,並返回APPROVE_OPTION、CANCEL_OPTION(或者用戶選擇取消按鈕或者離開了對話框)或者ERROR_OPTION(若是發生錯誤)。
    • File getSelectedFile()
    • File[] getSelectedFiles()
      獲取用戶選擇的一個文件或多個文件(若是用戶沒有選擇文件,返回null)。
    • void setFileFilter(FileFilter filter)
      設置文件對話框的文件過濾器。全部讓filter.accept返回true的文件都會被顯示,而且將過濾器添加到可選過濾器列表中。
    • void addChooseableFileFilter(FileFilter filter)
      將文件過濾器添加到可選過濾器列表中。
    • void setAcceptAllFileFilterUsed(boolean b)
      在過濾器組合框中包括或者取消All files過濾器。
    • void resetChoosableFileFilters()
      清除可選過濾器列表。除非All filtes過濾器被顯式地清除,不然它仍然會存在。
    • void setFileView(FileView view)
      設置一個文件視圖來提供文件選擇器顯示信息。
    • void setAccessory(JComponent component)
      設置一個附件組件。
  10. javax.swing.fileCooser.FileFilter 1.2
    • boolean accept(File f)
      若是文件選擇器能夠顯示這個文件,返回true。
    • String getDescription()
      返回這個文件過濾器的說明信息,例如,Image Fils(.gif,.jpeg)。
  11. javax.swing.fileChooser.FileNameExtensionFiler 6
    • FileNameExtensFilter(String description,String… extensions)
      利用給定的描述構造一個文件過濾器。這些描述限定了被接收的全部目錄和文件其名稱結尾的句點以後所包含的擴展字符串。
  12. javax.swing.filechooser.FileView 1.2
    • String getName(File f)
      返回文件f的文件名,或者null。一般這個方法返回f.getName()。
    • String getDescription(File f)
      返回文件f的可讀性描述,或者null。例如,若是f是HTML文檔,那麼這個方法有可能返回它的標題。
    • String getTypeDescription(File f)
      返回文件f的類型的可讀性描述。例如,若是f是HTML文檔,那麼這個方法有可能返回Hypertext document字符串。
    • Icon getIcon(File f)
      返回文件f的圖標,或者null。例如,若是f是JPEG文件,那麼這個方法有可能返回簡略的圖標。
    • Boolean isTraversable(File f)
      若是f是用戶能夠打開的目錄,返回Boolean.TRUE。若是目錄在概念上是符合文檔,那麼這個方法有可能返回false。與全部的FileView方法同樣,這個方法有可能返回null,用於標示文件選擇器應該使用默認視圖。

9.7.5 顏色選擇器

  1. Swing還提供了一種選擇器-JColorChooser。能夠利用這個選擇器選取顏色。與JFileChooser同樣,顏色選擇器也是一個組件,而不是一個對話框,可是它包含了用於建立包含顏色選擇器組件的對話框方法。
  2. 顯示顏色選擇器對話框,須要提供:
    • 一個父組件。
    • 對話框的標題。
    • 選擇模式/無模式對話框的標誌。
    • 顏色選擇器。
    • OK和Cancel按鈕的監聽器。
  3. javax.swing.JColorChooser 1.2
    • JColorChooser()
      構造一個初始顏色爲白色的顏色選擇器。
    • Color getColor()
    • void setColor(Color c)
      獲取和設置顏色選擇器的當前顏色。
    • static Color showDialog(Component parent,String title,Color initialColor)
      顯示包含顏色選擇器的模式對話框。
      參數:parent 對話框顯示在上面的組件。 title 對話框框架的標題。 initialColor 顏色選擇器的初始顏色。
    • static JDialog createDialog(Component parent,String title,boolean modal,JColorChooser chooser,ActionLstener okListener,ActionListener cancelListener)建立一個包含顏色選擇器的對話框。參數:parent 對話框顯示在上面的組件。title 對話框框架的標題。modal 若是直到對話框關閉,這個調用都被阻塞,則返回true。chooser 添加到對話框中的顏色選擇器。okListener,cancelListener OK和Cancel按鈕的監聽器。
相關文章
相關標籤/搜索