Download presentation
Presentation is loading. Please wait.
1
視窗程式設計 8.按鈕、核取方塊與按鈕群組 Chih Hung Wang Reference:
1. Java 2 視窗程式設計,文魁出版社,位元文化編著 (2008) (教科書) 2. 深入研究Java Swing,上奇資訊股份有限公司,黃嘉輝著 (2011) 3. Java SE 6.0視窗程式設計之道,碁峰出版社,黃嘉輝著 (2008) 4. Java 初學指引,博碩文化,陳錦輝著 (2010) 視窗程式設計 8.按鈕、核取方塊與按鈕群組 Chih Hung Wang
2
Swing的按鈕元件 以下為Swing提供的按鈕元件: JButton(指令按鈕) JToggleButton(切換按鈕)
JCheckBox(核取方塊) JRadioButton(選擇鈕) JMenuItem(功能表選項)以其子類別 AbstractButton類別 建立上述按鈕元件的類別均繼承於AbstractButton類別,此類別可以引發以下語意事件: ActionEvent事件 ChangeEvent事件 ItemEvent事件 以下為AbstractButton類別繼承架構:
3
下表將介紹AbstractButton類別的常用方法:
5
ButtonModel介面 而對於按鈕元件狀態的維護,則由實作ButtonModel介面的Model物件負責,除了JToggleButton類別外,其他按鈕元件類別均預設使用DefaultButtonModel類別,DefaultButtonModel類別的繼承架構如下所示: JToggleButton類別及其子類別則使用衍生DefaultButtonModel類別的JToggleButton.ToggleButtonModel類別。ToggleButtonModel類別的繼承架構如下: 以下為DefaultButtonModel類別的屬性,用於控制按鈕元件的狀態,您可呼叫isXXX()方法與setXXX()方法取得或設定這些屬性。 selected:每按一下即改變狀態。 pressed:當按鈕被滑鼠按下時,傳回true。 rollover:當滑鼠移至按鈕上時,傳回true。 armed:當按下滑鼠,但在按鈕範圍外放開滑鼠,將不引發事件。 enabled:設定為true表按鈕可被使用,若設定為false則按鈕將失效無法使用。
6
指令按鈕 指令按鈕的基本運用 指令按鈕用於執行動作,常用於確認、取消對話盒輸入的資料,如下圖所示。
指令按鈕的建立將運用JButton元件。當按下指令按鈕時,將觸發ActionEvent事件,因此,指令按鈕欲執行的動作,將藉由回應ActionEvent事件的機會執行。本節將運用兩個範例介紹如何運用JButton類別建立指令按鈕元件,圖為範例7-1的執行結果。
7
Ex7-1 package mid; import javax.swing.*; import java.awt.*;
import java.awt.event.*; //引用處理事件的event套件 public class Mid extends JFrame{ JButton enable = new JButton("使圖示按鈕有效"); JButton disable = new JButton(); JButton iconBtn = new JButton(new ImageIcon( Mid.class.getResource("images/bitc.gif"),"位元文化LOGO")); //宣告指令按鈕物件 //定義並宣告監聽器物件 ActionListener al = new ActionListener(){ public void actionPerformed(ActionEvent e){ //取得動作命令字串, 並判斷觸發事件的按鈕 if(e.getActionCommand().equals("enable")){ enable.setEnabled(false); //依照需求設定按鈕是否有效 disable.setEnabled(true); iconBtn.setEnabled(true); } else{ enable.setEnabled(true); disable.setEnabled(false); iconBtn.setEnabled(false); };
8
Mid(){ disable.setText("使圖示按鈕無效"); //設定按鈕顯示的文字 enable.setActionCommand("enable"); //設定按鈕的動作命令字串 disable.setActionCommand("disable"); disable.setEnabled(false); //將按鈕的起始狀態設定為無效 iconBtn.setEnabled(false); enable.addActionListener(al); //註冊監聽器 disable.addActionListener(al); Container cp = getContentPane(); //取得內容面版 cp.setLayout(new FlowLayout()); //設定以FlowLayout配置版面 cp.add(enable); //將元件加入面版 cp.add(iconBtn); cp.add(disable); //設定視窗關閉動作、視窗大小, 並顯示視窗 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 150); setVisible(true); } public static void main(String args[]) { new Mid(); //宣告視窗框架物件
9
ActionEvent事件的回應 以下將說明JButton類別建構子的規格: public JButton()
public JButton(Icon icon) public JButton(String text) public JButton(Action a) public JButton(String text, Icon icon) 下表將介紹定義於JButton類別的常用方法。 ActionEvent事件的回應 以下敘述將以匿名類別的方式,宣告回應按鈕ActionEvent事件的監聽器物件。監聽器物件回應ActionEvent事件時,將呼叫ActionEvent物件的getSource()方法取得觸發事件的元件,再呼叫getActionCommand ()方法取得觸發事件之元件的動作命令字串,並判斷動作命令字串是否為enable(第18行),是則將enable按鈕設定為無效,disabel按鈕與iconBtn按鈕設定為有效(第18~22行)。否則設定enable按鈕設定為有效,disable按鈕與iconBtn按鈕設定為無效(第23~27行)。
10
以指令按鈕控制CardLayout 設定助憶符號與預設按鈕
本節的範例7-3修改自範例7-2,將介紹如何設定指令按鈕的助憶符號,以及視窗的預設按鈕,執行結果如下:
11
設定指令按鈕不同狀態使用不同圖示 在不同狀態下,按鈕元件可使用不同圖示,以下將列出各種不同狀態,與設定圖示的方法:
12
Ex7-2 package mid; import javax.swing.*; import javax.swing.event.*;
import java.awt.*; import java.awt.event.*; //引用處理事件的event套件 public class Mid extends JFrame { JLabel[] lbImage = { //宣告顯示圖片的標籤物件 new JLabel( new ImageIcon( Mid.class.getResource("images/A4023.jpg"), "Access 2003 徹底研究")), Mid.class.getResource("images/A4033.jpg"), "Access 2003 程式設計")), Mid.class.getResource("images/A4043.jpg"), "Access 2003 網路應用")), Mid.class.getResource("images/W4075.jpg"), "ASP動態網頁入門實務")), Mid.class.getResource("images/W3135.jpg"), "JSP動態網頁入門實務")) }; JButton btnPre = new JButton("上一頁"), //宣告控制CardLayout面版顯示內容的按鈕 btnNext = new JButton("下一頁"), btnFirst = new JButton("第一頁"), btnLast = new JButton("最後一頁"), btnName = new JButton("ASP動態網頁入門實務");
13
ActionListener alBtn = new ActionListener(){ //定義監聽ActionEvent事件的監聽器類別
public void actionPerformed(ActionEvent e){ String strCommand = e.getActionCommand(); //取得動作命令字串 if(e.getActionCommand().equals("上一頁")) cl.previous(jpImage); //移至上一張卡片 else if(e.getActionCommand().equals("下一頁")) cl.next(jpImage); //移至下一張卡片 else if(e.getActionCommand().equals("第一頁")) cl.first(jpImage); //移至第一張卡片 else if(e.getActionCommand().equals("最後一頁")) cl.last(jpImage); //移至最後一張卡片 else if(e.getActionCommand().equals("ASP動態網頁入門實務")) cl.show(jpImage, "ASP動態網頁入門實務"); //移至描述內容為"ASP動態網頁入門實務"的卡片 } }; CardLayout cl = new CardLayout(10, 5); //宣告配置版面的CardLayout物件 JPanel jpImage = new JPanel(cl); //宣告容納圖片的JPanel容器 Mid(){ //以for迴圈將包含圖片的標籤元件與敘述加入容器 for(JLabel elm: lbImage) jpImage.add(elm , ((ImageIcon)elm.getIcon()).getDescription());
14
JPanel jpBtn = new JPanel(new GridLayout(5, 1, 20, 10));
//宣告JPanel物件並設定以GridLayout配置版面 jpBtn.add(btnFirst); //將按鈕元件加入JPanel容器 jpBtn.add(btnPre); jpBtn.add(btnNext); jpBtn.add(btnLast); jpBtn.add(btnName); //註冊處理滑鼠事件的監聽器 btnFirst.addActionListener(alBtn); btnPre.addActionListener(alBtn); btnNext.addActionListener(alBtn); btnLast.addActionListener(alBtn); btnName.addActionListener(alBtn); Container cp = getContentPane(); //取得內容面版 cp.setLayout(new FlowLayout()); //設定使用FlowLayout配置版面 cp.add(jpBtn); //將元件加入內容面版 cp.add(jpImage); //設定視窗預設的關閉動作、視窗大小, 並顯示視窗 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(450, 300); setVisible(true); } public static void main(String args[]) { new Mid(); //宣告視窗框架物件
15
由於指令按鈕沒有選取狀態,因此,若設定略過選取、選取與無效選取狀態使用的圖示,將看不出效果。範例7-4將示範設定指定按鈕在正常、略過、按下、無效這四個狀態使用不同圖示產生的效果。
自訂擁有蹦現功能表的按鈕 IE瀏覽器上方的工具列,有一種按下左方 ▼ 按鈕,便可呼叫蹦現功能表的按鈕控制項,如下圖所示。 範例7-5將以繼承JComponent類別的方式,定義類似上圖擁有蹦現功能表的按鈕元件,建立此按鈕元件的類別包含兩個指令按鈕,並擁有蹦現功能表,執行結果如下圖所示。
16
核取方塊 核取方塊的基本運用 核取方塊用於供使用者選取設定,如下圖所示。
本節將運用範例7-6介紹如何運用JCheckBox類別建立核取方塊元件,執行結果如下圖。
17
void itemStateChanged(ItemEvent e)
以下將說明JCheckBox類別建構子的規格: public JCheckBox() public JCheckBox(Icon icon) public JCheckBox(Icon icon, boolean selected) public JCheckBox(String text) public JCheckBox(Action a) public JCheckBox(String text, boolean selected) public JCheckBox(String text, Icon icon) public JCheckBox(String text, Icon icon, boolean selected) ItemEvent事件的回應 當使用者選取核取方塊將觸發ItemEvent事件,ItemEvent類別的繼承架構如下所示。 而回應ItemEvent事件的監聽器類別,需實作ItemListener介面。該介面定義了一個void itemStateChanged()方法,規格如下: void itemStateChanged(ItemEvent e)
18
ItemEvent類別除繼承自各基礎事件類別定義的方法外,還提供下表所列的方法。
7-3-2 運用圖示的核取方塊 當核取方塊運用圖示時,將不會出現供使用者勾選的方塊,而會以圖示取代。範例7-7將設定核取方塊使用圖示,並設定不同狀態下,顯示不同的圖示,執行結果如圖所示。
19
選擇按鈕與按鈕群組 範例 選擇按鈕 本節將運用範例7-8介紹選擇按鈕與按鈕群組的運用,執行結果如下圖所示。
視窗程式的選擇按鈕用於提供使用者在數種選項內,點選其中一種選項,如下圖所示。
20
選擇鈕ActionEvent事件的回應 按鈕群組
選擇按鈕的建立將運用JRadioButton類別。以下將說明JRadioButton類別建構子的規格: public JRadioButton() public JRadioButton(Icon icon) public JRadioButton(Icon icon, boolean selected) public JRadioButton(String text) public JRadioButton(Action a) public JRadioButton(String text, boolean selected) public JRadioButton(String text, Icon icon) public JRadioButton(String text, Icon icon, boolean selected) 選擇鈕ActionEvent事件的回應 對於加入相同按鈕群組的選擇按鈕,通常將運用同一個監聽器物件回應ActionEvent事件。至於各選擇按鈕的區分,則運用動作命令字串判別。以下敘述便運用前述技巧,定義回應同一按鈕群組內選擇按鈕之ActionEvent事件的監聽器物件(第18~33行)。 按鈕群組 ButtonGroup類別用於建立按鈕群組,可將數個按鈕元件(AbstractButton類別之衍生類別建立的按鈕元件),組合成一個群組。當其中一個按鈕元件被按下(on)時,群組內的其他按鈕元件的狀態便將被設定為取消(off)。ButtonGroup類別的繼承架構如下所示。
21
ButtonGroup類別只有一個建構子,且不需傳入任何參數,規格如下:
public ButtonGroup() 下表將介紹ButtonGroup類別定義的方法。
22
切換按鈕 切換按鈕的用途與選擇按鈕類似,均可提供使用者在數個選項裡,選取一種選項。欲建立一組控制特定設定的切換按鈕,需運用JToggleButton類別,並配合建立按鈕群組的ButtonGroup類別(7-4-3節)。 範例7-9將示範運用切換按鈕控制標籤內文字的垂直方向對齊方式,執行結果如下圖所示。 以下將說明JToggleButton類別建構子的規格: public JToggleButton() public JToggleButton(Icon icon) public JToggleButton(Icon icon, boolean selected) public JToggleButton(String text) public JToggleButton(Action a) public JToggleButton(String text, boolean selected) public JToggleButton(String text, Icon icon) public JToggleButton(String text, Icon icon, boolean selected)
23
void stateChanged(ChangeEvent e)
7-4節的範例7-8將運用回應ActionEvent事件的方式,控制標籤內文字的水平對齊方式。範例7-9則運用回應JToogleButton類別ChangeEvent事件的機會,完成標籤內文字垂直方向對齊方式的控制。 而回應ChangeEvent事件的監聽器類別,需實作ChangeListener介面,此介面包含於javax.swing.event套件內。該介面定義了void itemStateChanged()方法,規格如下: void stateChanged(ChangeEvent e)
Similar presentations