視窗程式設計 10. 組合方塊與對話盒 Chih Hung Wang Reference: 1. Java 2 視窗程式設計,文魁出版社,位元文化編著 (2008) (教科書) 2. 深入研究Java Swing,上奇資訊股份有限公司,黃嘉輝著 (2011) 3. Java SE 6.0視窗程式設計之道,碁峰出版社,黃嘉輝著 (2008) 4. Java 初學指引,博碩文化,陳錦輝著 (2010) 視窗程式設計 10. 組合方塊與對話盒 Chih Hung Wang
JComboBox的運作架構 組合方塊提供使用者以選取蹦現清單內選項的方式執行設定。若組合方塊提供編輯功能,則可輸入清單選項以外的設定值,如下圖所示。 Swing將運用JComboBox類別建立組合方塊,整個控制項將由文字欄位、按鈕與蹦現清單三個部分結合而成,使用者可以選取清單內的某一個選項。JComboBox類別繼承架構如下所示。
JComboBox類別的基本運用 ComboBox類別可回應的三種事件,則說明如下; ActionEvent事件:當使用者確定選取某選項,或於組合方塊的文字欄按下 Enter按鍵,將觸發此事件。 ItemEvent事件:當使用者點選組合方塊清單的選項時,將觸發此事件。 PopupMenuEvent事件:當使用者按下 ▼ 按鈕展開清單時,將觸發此事件。 JComboBox類別的基本運用 範例9-1將介紹如何運用JComboBox類別建立組合方塊,執行結果如下圖所示。
JComboBox類別的建構子 以下將介紹JComboBox類別建構子的規格: public JComboBox() public JComboBox(Vector<?> items) public JComboBox(Object[] items) public JComboBox(ComboBoxModel aModel) JComboBox類別的常用方法 下表將列出定義於JComboBox類別較常運用的方法。
ComboBoxModel介面的基本應用 對於組合方塊的清單內選項內容的控制,將運用實作ComboBoxModel介面的Model物件負責,預設使用DefaultComboBoxModel類別。DefaultComboBoxModel類別的繼承架構如下所示。 ComboBoxModel介面繼承自ListModel介面(8-4節),並增加定義了setSelectedItem()方法與getSelectedItem()方法,setSelectedItem()方法的規格如下: void setSelectedItem(Object anItem) getSelectedItem()方法的規格如下: Object getSelectedItem() 範例9-2將為您介紹如何運用Model物件,控制組合方塊清單的選項內容,執行結果如圖所示。
若Book類別未定義toString()方法,則選項將顯示物件參考的位址值,如圖所示。 9-3-2 具有記憶功能的組合方塊 範例9-3則為您介紹如何運用Model物件,將清單選項內容儲存至檔案,並於執行程式時,再將選項內容從檔案載入,執行結果如下圖所示。 若組合方塊文字欄的輸入值不在清單選項內時,輸入值將加入清單。關閉程式時,新增選項將一併被儲存。下次重新執行時,新增的選項則將出現在清單內。
自訂選項資料的顯示 由於組合方塊的清單是以JList物件建立,因此,對於清單內選項的顯示,亦可運用8-5節介紹的轉譯器自行定義。範例9-4修改自範例9-3,將增加繼承DefaultListCellRenderer類別(8-5節)的BookCellRenderer轉譯器類別,以自訂組合方塊清單選項的顯示,執行結果如下圖所示。
輸入值與選項的自動比對 當組合方塊的清單選項過多時,應該提供協助使用者選取選項的功能。最常見的方式就是運用使用者的輸入值,自動搜尋清單內的選項,並將搜尋到的選項值顯示於組合方塊的文字欄。 範例9-5將運用回應KeyEvent事件的機會,達成上述功能,執行結果如下圖所示。
對話盒與選擇器 對話盒為應用程式裡,用於與使用者互動,顯示提醒使用者的簡單訊息,或供使用者執行設定。對話盒共有模式(modal)與非模式(non-modal)兩種,當於畫面顯示模式對話盒時,將凍結應用程式主視窗的功能,直到對話盒消失為止。相對地,非模式對話盒顯示於畫面時,主視窗不會被凍結使用者仍可執行操作。 Swing對於對話盒的建立針對以下三種需求,提供三種方式: 自訂對話盒:使用者可運用繼承JDialog類別的方式,定義自訂對話盒。 對話方塊:JOptionPane類別將定義顯示警告、錯誤、告知…等訊息的對話方塊。 檔案與顏色的選擇器:Swing提供JFileChooser類別與JColorChooser類別做為選取檔案與顏色的選擇器。 JDialog類別是一個與JFrame類別幾乎相同的容器,同樣以JRootPane物件做為儲存區,由內容面版容納對話盒的元件,並提供預設的視窗關閉行為。 與JFrame相同的,若未指定JDialog類別的顯示位置時,對話盒將顯示於視窗的左上角。您可以呼叫setLocationRelativeTo()方法(此方法繼承自Window類別),設定對話盒顯示於建立對話盒之元件的中央。 JDialog類別的繼承架構如下: 13-2 自訂對話盒 – JDialog類別
JDialog類別的建構子 以下為JDialog類別提供之建構子的規格: public JDialog() throws HeadlessException public JDialog(Frame owner) throws HeadlessException public JDialog(Frame owner, boolean modal) throws HeadlessException public JDialog(Frame owner, String title) public JDialog(Frame owner, String title, boolean modal) public JDialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc) public JDialog(Dialog owner) throws HeadlessException public JDialog(Dialog owner, boolean modal) public JDialog(Dialog owner, String title) public JDialog(Dialog owner, String title, boolean modal) public JDialog(Dialog owner, String title, boolean modal, GraphicsConfiguration gc) throws HeadlessException
JDialog類別的常用方法 下表將介紹JDialog類別的常用方法。
範例13-1修改自範例12-5,將改用對話盒執行資料的新增與修改,執行結果如下圖所示。 定義處理資料的對話盒 BookDataDialog類別繼承自JDialog類別,並實作ActionListener介面建立執行資料新增與修改的對話盒,且由對話盒本身監聽 儲存 與 取消 按鈕的ActionEvent事件。表將介紹該類別各屬性的用途:
下表則說明BookDataDialog類別定義的建構子與方法。
建立常用對話盒– JOptionPane類別 以JOptionPane類別建立對話盒 在視窗程式的執行過程中,常需運用對話盒顯示警告、錯誤…之類的訊息,或要求使用者確認欲執行動作,或要求使用者輸入單筆資料。這類對話盒有固定的畫面格式,您可運用Swing提供的JOptionPane類別建立這類對話盒,而不需以繼承JDialog類別的方式建立對話盒。JOptionPane類別的繼承架構如下: JOptionPane類別繼承自JComponent類別,因此,雖然我們會呼叫它的靜態方法建立對話方塊,但JOptionPane類別本身並不是對話盒。事實上,您可將它視為擁有固定格式的容器,且容器畫面將區分為四個部分,本書稱為對話盒面版,如下圖所示。
以下將介紹運用JOpionPane類別可以建立的四種對話盒類型,以及建立對話盒的靜態方法。
JOptionPane類別的建構子與常用方法 public JOptionPane() public JOptionPane(Object message) public JOptionPane(Object message, int messageType) public JOptionPane(Object message, int messageType, int optionType) int optionType, Icon icon) int optionType, Icon icon, Object[] options) int optionType, Icon icon, Object[] options, Object initialValue) JOptionPane類別的常用方法 建立對話盒的靜態方法 下表僅列出這類建立對話盒之靜態方法的名稱
訊息對話盒 以下為建立訊息對話盒之showMessageDialog()靜態方法的規格: public static void showMessageDialog( Component parentComponent, Object message) throws HeadlessException Component parentComponent, Object message, String title, int messageType) String title, int messageType, Icon icon)
運用訊息對話盒面版建立內部框架之showInternalMessageDialog()靜態方法的規格如下,參數說明請參考showMessageDialog()靜態方法。 public static void showInternalMessageDialog( Component parentComponent, Object message) Component parentComponent, Object message, String title, int messageType) String title, int messageType, Icon icon) 依照不同的訊息型態,訊息對話盒將顯示不同圖示,列於下表。
範例13-2將示範建立各種類型的訊息對話盒,執行結果如下圖所示。 以下為建立確認對話盒之showConfirmDialog()靜態方法的規格: public static int showConfirmDialog( Component parentComponent, Object message) throws HeadlessException Component parentComponent, Object message, String title, int optionType) String title, int optionType, int messageType) String title, int optionType, int messageType, Icon icon) throws HeadlessException 13-3-4確認對話盒
以確認對話盒面版建立內部框架之showInternalConfirmDialog()靜態方法的規格如下,參數說明請參考showConfirmDialog()靜態方法。 public static int showInternalConfirmDialog( Component parentComponent, Object message) Component parentComponent, Object message, String title, int optionType) String title, int optionType, int messageType) String title, int optionType, int messageType, Icon icon) 當設定確認對話盒的訊息型態時,將影響對話盒顯示的Java內建圖示。範例13-3將示範如何建立確認對話盒,執行結果如下圖所示。
資料輸入對話盒 showInputDialog()靜態方法將可建立資料輸入對話盒。當傳入預設值時,將建立提供文字欄輸入資料的對話盒。若傳入數個值時,則將建立以組合方塊或清單方塊輸入資料的對話盒。方法的規格如下: public static String showInputDialog(Object message) throws HeadlessException public static String showInputDialog(Object message, Object initialSelectionValue) public static String showInputDialog( Component parentComponent, Object message) Component parentComponent, Object message, String title, int messageType) public static Object showInputDialog( String title, int messageType, Icon icon, Object[] selectionValues, Object initialSelectionValue)
運用資料輸入對話盒面版建立內部框架之showInternalInputDialog()靜態方法的規格如下,參數說明請參考showInputDialog()靜態方法。 public static String showInternalInputDialog( Component parentComponent, Object message) Component parentComponent, Object message, String title, int messageType) public static Object showInternalInputDialog( String title, int messageType, Icon icon, Object[] selectionValues, Object initialSelectionValue) 範例13-4將示範資料輸入對話盒的建立,執行結果如下圖所示。
以自訂JOptionPane面版建立對話盒 以下為建立自訂對話盒之showOptionDialog ()靜態方法的規格: public static int showOptionDialog( Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue) throws HeadlessException 以下為運用對話盒面版建立內部框架之showInternalOptionDialog()靜態方法的規格,參數說明請參考showOptionDialog ()靜態方法。 public static int showInternalOptionDialog( Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue) 範例13-5將示範自訂對話盒的建立,執行結果如下圖所示。
範例13-5將示範建立自訂對話盒的兩種不同方式,第一種將宣告JOptionPane物件,然後呼叫createDialog()方法建立對話盒物件,建立顯示詢問問題的自訂對話盒,如上圖右下角的自訂對話盒。第二種則是以呼叫showOptionDialog()靜態方法的方式,宣告顯示應用程式資訊的關於對話盒,如下圖所示。 檔案選擇器 JFileChooser類別 JFileChooser類別用於建立檔案選擇器,以便用於建立選取欲操作檔案之對話盒的畫面,並提供選取檔案、篩選檔案類型、顯示特定檔案圖示…等功能。JFileChooser類別的繼承架構如下:
JFileChooser類別的建構子 以下為JFileChooser類別建構子的規格: public JFileChooser() public JFileChooser(String currentDirectoryPath) public JFileChooser(File currentDirectory) public JFileChooser(FileSystemView fsv) public JFileChooser(File currentDirectory, FileSystemView fsv) public JFileChooser(String currentDirectoryPath, FileSystemView fsv) JFileChooser類別的常用方法
檔案選擇器的基本操作 範例13-6將分別示範建立開啟舊檔對話盒、儲存檔案對話盒與自訂檔案選取對話盒,執行結果如下圖所示。
下圖為自訂的檔案選取對話盒。 下圖為儲存檔案對話盒。 檔案篩選物件 當欲篩選檔案選擇器顯示之檔案的類型時,可以透過繼承FileFilter抽象類別的方式,自訂檔案篩選類別。下表將介紹FileFilter抽象類別的方法。
運用FileView類別與FileSystemView類別控制檔案顯示 FileView抽象類別包含於javax.swing.filechooser套件內,將提供檔案選擇器顯示檔案時,所需要之檔案的名稱、圖示、描述文字…等資訊。從功能來看,FileView抽象類別相當於JFileChooser類別顯示檔案選擇器時,使用的轉譯器物件。FileView抽象類別的繼承架構如下所示: 下表將說明FileView抽象類別的建構子與方法。
取得系統檔案資訊的FileSystemView抽象類別 由於Java的跨平台特性,JFileChooser類別建立操作檔案的檔案選擇器時,必須能夠應付不同作業平台的不同檔案系統,例如:以Unix系統來說,只有一個根資料夾『\』,Mac系統則用volume代表,但Windows系統則有許多個根資料夾。 為了克服檔案系統問題,JFileChooser類別將運用FileSystemView抽象類別的協助,取得系統檔案的相關資料,例如:根資料夾、檔案或資料夾的系統顯示名稱、系統顯示圖示…等。FileSystemView抽象類別的架構如下所示: 下表將說明FileSystemView抽象類別的建構子與方法。
範例13-7將介紹如何運用FileView抽象類別與FileSystemView抽象類別,控制檔案選擇器所顯示的檔案內容,執行結果如下圖所示:
繼承JFileChooser類別自訂檔案對話盒 若希望自行定義檔案對話盒,於對話盒內增加控制項,可以運用繼承JFileChooser類別的方式,覆蓋建立對話盒的createDialog()靜態方法,並於該方法內,取得對話盒的內容面版,然後加入控制項。 當將控制項加入檔案對話盒後,另一個重點就是如何運用監聽對話盒PropertyChangeEvent事件的機制,讓檔案選擇器與新增控制項互動。 範例13-8將自訂檔案對話盒,並於檔案對話盒下方加入清單方塊,以顯示選取檔案的更多資訊,執行結果如下圖所示。
13-5 顏色選擇器 13-5-1JColorChooser類別 JColorChooser類別則用於建立供使用者選取顏色的顏色選擇器,畫面如下圖所示。
JColorChooser類別的繼承架構如下: JColorChooser類別建立顏色選擇器時,將運用ColorSelectionModel介面的實作類別,處理顏色對話盒的顏色選擇模型,並提供addChangeListener()方法,以註冊監聽顏色改變時,所觸發ChangeEvent事件的監聽器物件。欲取得或設定顏色選擇器目前選擇的顏色,則可呼叫getSelectedColor()方法與setSelectedColor()方法。Swing將提供DefaultColorSelectionModel類別,做為預設的介面實作類別,其繼承架構如下: JColorChooser類別建構子 JColorChooser類別建構子的規格如下: public JColorChooser() public JColorChooser(Color initialColor) public JColorChooser(ColorSelectionModel model)
JColorChooser類別的常用方法
顏色選擇器的基本運用 範例13-9將介紹如何建立與顯示顏色選擇器,並取得選取結果,執行結果如下。
自訂預覽顏色面版 範例13-10將示範如何自訂預覽顏色面版,並運用此面版控制前景/背景顏色的選取,執行結果如下圖所示。
預覽顏色面版的自訂 範例13-10將以繼承JPanel類別的方式,定義PreviewPanel類別建立供顏色選擇器運用的預覽顏色面版。該面版將提供顯示顏色選取結果與原始顏色設定的標籤,以及控制選取背景顏色或前景顏色的切換按鈕,如下圖所示。 13-5-4 自訂顏色選擇面版 範例13-11將示範如何自訂顏色選擇面版,此面版將提供拉動桿,使用者可運用滑鼠拖曳的方式,控制欲選取的灰階顏色,執行結果如下圖所示。
建立自訂顏色選擇面版的類別必須繼承AbstractColorChooserPanel抽象類別,並至少完成下表所列方法的實作。 13-5-5 運用顏色選擇器自訂顏色對話盒 範例13-12將以繼承JDialog類別的方式自訂顏色對話盒,並運用顏色選擇器為對話盒提供顏色選取功能,執行結果如下圖所示
我們將以繼承JDialog類別的方式,定義設定字型、背景/前景顏色的自訂對話盒 – FontColorDialog類別。下表將介紹該類別所運用屬性:
下表則介紹FontColorDialog類別的建構子與方法。