
對話框是桌面應(yīng)用程序中一種很重要的組件,例如在刪除一個(gè)文件的時(shí)候,系統(tǒng)就會用對話框的形式提醒用戶是否確定要?jiǎng)h除這個(gè)文件。Swing體系中有兩類對話框:第一類是系統(tǒng)對話框,第二類是自定義對話框。系統(tǒng)對話框就是Swing體系已經(jīng)定義好的對話框,它們的基本界面是Java基礎(chǔ)類庫已經(jīng)設(shè)計(jì)好的,程序員只需要調(diào)用一個(gè)方法就能把這個(gè)對話框顯示出來。而自定義對話框是指由程序員自己設(shè)計(jì)的對話框,這種對話框的界面完全由程序員根據(jù)實(shí)際業(yè)務(wù)的需要自行設(shè)計(jì)。任何對話框都是從某個(gè)窗體上彈出來的,沒有憑空出現(xiàn)的對話框。
系統(tǒng)對話框又可以分為三種,分別消息對話框、確認(rèn)對話框和輸入對話框。對話框不能做最大化、最小化以及調(diào)節(jié)大小的操作。系統(tǒng)對話框的基本結(jié)構(gòu)是固定的,它們都有標(biāo)題、圖標(biāo)、消息和按鈕四個(gè)部分。本小節(jié)將詳細(xì)講解三種系統(tǒng)對話框和自定義對話框的使用。
消息對話框用于向用戶傳達(dá)一件已經(jīng)發(fā)生了的事情,用戶在看到這個(gè)對話框之后所能做的操作就只有點(diǎn)擊一下“確定”按鈕,表示自己已經(jīng)知道了這個(gè)消息。所有彈出系統(tǒng)對話框,都要調(diào)用JoptionPane類的showMessageDialog()靜態(tài)方法。showMessageDialog()方法有3個(gè)重載版本,如表20-12所示。
【資料圖】
表20-12 showMessageDialog()方法
方法 | 功能 |
void showMessageDialog(Component parentComponent,Object message) | 在parentComponent窗體上彈出消息對話框,消息為message |
void showMessageDialog(Component parentComponent,Object message, String title, int messageType) | 在parentComponent窗體上彈出消息對話框,消息為message,對話框標(biāo)題為title,消息類型為messageType |
void showMessageDialog(Component parentComponent,Object message, String title, int messageType, Icon icon) | 在parentComponent窗體上彈出消息對話框,消息為message,對話框標(biāo)題為title,消息類型為messageType |
從表20-12可以看出:消息對話框的類型messageType是int型參數(shù),這個(gè)參數(shù)一般都用JOptionPane類的靜態(tài)屬性表示,下面的表20-13展示了各種靜態(tài)屬性所代表的消息類型。
表20-13 消息類型
靜態(tài)屬性? | 所代表的消息類型? |
ERROR_MESSAGE? | 錯(cuò)誤? |
INFORMATION_MESSAGE? | 提示信息? |
WARNING_MESSAGE? | 警告? |
QUESTION_MESSAGE? | 提問? |
PLAIN_MESSAGE? | 普通消息? |
下面的【例20_22】展示了如何彈出三種消息對話框。
【例20_22 消息對話框】
Exam20_22.java
import java.awt.*;import java.awt.event.*;import javax.swing.*;class Exam20_22Frame extends JFrame{ JButton[] buttons; public Exam20_22Frame(){ init(); } private void init( ){ Container container = this.getContentPane(); container.setLayout(null); buttons = new JButton[3]; buttons[0] = new JButton("對話框1"); buttons[1] = new JButton("對話框2"); buttons[2] = new JButton("對話框3"); for(int i=0;i【例20_22】的運(yùn)行結(jié)果如圖20-23所示。
圖20-23【例20_22】運(yùn)行結(jié)果
在圖20-23所示的窗體上,單擊任意一個(gè)按鈕都會一個(gè)消息對話框,圖20-23所示的彈出第二種形式,即指定了消息對話框的消息、標(biāo)題以及消息類型?!纠?0_22】的第三個(gè)按鈕所彈出的消息對話框要設(shè)置一個(gè)圖標(biāo),這個(gè)圖標(biāo)是a.png,為了正確顯示出這個(gè)圖標(biāo),需要讀者在工程根目錄下添加a.png。
20.7.2確認(rèn)對話框
確認(rèn)對話框的作用主要是用來向用戶確認(rèn)要不要做某個(gè)操作,或者用戶到底想做什么樣的操作。例如在刪除文件的時(shí)候,系統(tǒng)就會用一個(gè)確認(rèn)對話框向用戶確認(rèn)是不是真的要?jiǎng)h除這個(gè)文件。彈出確認(rèn)對話框是由JOptionPane類的showConfirmDialog()靜態(tài)方法完成的,這個(gè)方法有4個(gè)重載的版本,如表20-14所示。
表20-14 showConfirmDialog()方法
方法?
功能?
int showConfirmDialog(Component parentComponent,Object message)?
在parentComponent窗體上彈出確認(rèn)對話框,對話框文本是message?
int showConfirmDialog(Component parentComponent, Object message, String title, int optionType)?
在parentComponent窗體上彈出確認(rèn)對話框,對話框文本是message,對話框標(biāo)題為title,按鈕組合類型為optionType?
int showConfirmDialog(Component parentComponent, Object message, String title, int optionType, int messageType)?
在parentComponent窗體上彈出確認(rèn)對話框,對話框文本是message,對話框標(biāo)題為title,按鈕組合類型為optionType,消息類型為messageType?
int showConfirmDialog(Component parentComponent, Object message, String title, int optionType,int messageType, Icon icon)?
在parentComponent窗體上彈出確認(rèn)對話框,對話框文本是message,對話框標(biāo)題為title,按鈕組合類型為optionType,消息類型為messageType,圖標(biāo)為icon?
從表20-14可以看出:大部分情況下確認(rèn)對話框需要設(shè)置按鈕組合,所謂“按鈕組合”就是指確認(rèn)對話框上顯示的按鈕有哪些,這些按鈕組合也都是有JOptionPane類的靜態(tài)屬性表示的,如表20-15所示。
表20-15 確認(rèn)對話框按鈕組合
靜態(tài)屬性?
按鈕組合?
YES_NO_OPTION?
是與否的按鈕組合?
YES_NO_CANCEL_OPTION?
是、否與取消的按鈕組合?
OK_CANCEL_OPTION?
OK與取消的按鈕組合?
DEFAULT_OPTION?
默認(rèn)按鈕組合?
從表20-14還可以看出:showConfirmDialog()方法的返回值類型為int,這個(gè)返回值代表了用戶點(diǎn)擊了哪一個(gè)按鈕。這些返回值也可以由JOptionPane類的靜態(tài)屬性表示,這些靜態(tài)屬性如表20-16所示。
表20-16確認(rèn)對話框的返回值
靜態(tài)屬性?
返回值意義?
YES_OPTION?
用戶點(diǎn)擊了“是”按鈕?
NO_OPTION?
用戶點(diǎn)擊了“否”按鈕?
CANCEL_OPTION ?
用戶點(diǎn)擊了“取消”按鈕?
OK_OPTION?
用戶點(diǎn)擊了“OK”按鈕,與YES_OPTION相同?
CLOSED_OPTION?
用戶關(guān)閉了確認(rèn)對話框?
下面的【例20_23】展示了如何彈出確認(rèn)對話框,由于彈出確認(rèn)對話框和彈出消息對話框有很多相同的參數(shù),本例只演示彈出其中一種確認(rèn)對話框。
【例20_23 確認(rèn)對話框】
Exam20_23.java
import java.awt.*;import java.awt.event.*;import javax.swing.*;class Exam20_23Frame extends JFrame{ JButton button; public Exam20_23Frame(){ init(); } private void init( ){ Container container = this.getContentPane(); container.setLayout(null); button = new JButton("確認(rèn)對話框1"); button.setSize(200, 40); button.setLocation(50,20); button.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //彈出確認(rèn)對話框,設(shè)置對話框文本、標(biāo)題、按鈕組合 JOptionPane.showConfirmDialog(Exam20_23Frame.this, "在關(guān)閉前是否保存文檔?","關(guān)閉文檔提示",JOptionPane.YES_NO_CANCEL_OPTION); } }); container.add(button); }}public class Exam20_23 { public static void main(String[] args) { Exam20_23Frame frame = new Exam20_23Frame(); frame.setSize(320, 150); frame.setLocationRelativeTo(null); frame.setTitle("Exam20_23Frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}【例20_23】的運(yùn)行結(jié)果如圖20-24所示。
圖20-24【例20_23】運(yùn)行結(jié)果
在圖20-24所示的窗體上單擊“確認(rèn)對話框1”就會彈出確認(rèn)對話框。
20.7.3輸入對話框
輸入對話框的作用是讓用戶輸入一些信息,其中最常見的形式就是在對話框上出現(xiàn)一個(gè)文本框,由用戶在文本框當(dāng)中輸入信息。輸入對話框由JOptionPane類的showInputDialog()實(shí)現(xiàn),這個(gè)方法有6個(gè)的重載的版本,如表20-17所示。
表20-17 showInputDialog()方法
方法?
功能?
String showInputDialog(Object message)?
彈出輸入對話框,對話框文本是message?
String showInputDialog(Object message, Object initialSelectionValue)?
彈出輸入對話框,對話框文本是message,默認(rèn)的輸入信息為initialSelectionValue?
String showInputDialog(Component parentComponent,Object message)?
在parentComponent彈出輸入對話框,對話框文本是message?
String showInputDialog(Component parentComponent, Object message, Object initialSelectionValue)?
在parentComponent彈出輸入對話框,對話框文本是message,默認(rèn)的輸入信息為initialSelectionValue?
String showInputDialog(Component parentComponent, Object message, String title, int messageType)?
在parentComponent彈出輸入對話框,對話框文本是message,默認(rèn)的輸入信息為initialSelectionValue,對話框標(biāo)題是title,消息類型是messageType?
Object showInputDialog(Component parentComponent, Object message, String title, int messageType, Icon icon, Object[] selectionValues, Object initialSelectionValue)?
在parentComponent彈出輸入對話框,對話框上有一個(gè)下拉框。對話框文本是message,對話框標(biāo)題是title,消息類型是messageType,對話框圖標(biāo)是icon,輸入選項(xiàng)是selectionValues,默認(rèn)輸入信息為initialSelectionValue?
從表20-17可以看出:showInputDialog()方法的返回值類型為String,這個(gè)返回值就是用戶所輸入(或選擇)的信息。下面的【例20_24】展示了如何彈出一個(gè)輸入對話框。
【例20_24 輸入對話框】
Exam20_24.java
import java.awt.*;import java.awt.event.*;import javax.swing.*;class Exam20_24Frame extends JFrame{ JButton button; public Exam20_24Frame(){ init(); } private void init( ){ Container container = this.getContentPane(); container.setLayout(null); button = new JButton("輸入對話框"); button.setSize(200, 40); button.setLocation(50,20); button.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //彈出輸入對話框 Object input = JOptionPane.showInputDialog(Exam20_24Frame.this, "請問你想要什么禮物?","選擇禮物", JOptionPane.QUESTION_MESSAGE, null, new String[]{"iPhone","iPad","ice cream"}, "iPad"); } }); container.add(button); }}public class Exam20_24 { public static void main(String[] args) { Exam20_24Frame frame = new Exam20_24Frame(); frame.setSize(320, 150); frame.setLocationRelativeTo(null); frame.setTitle("Exam20_24Frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}【例20_24】的運(yùn)行結(jié)果如圖20-25所示。
圖20-25【例20_24】運(yùn)行結(jié)果
在圖20-25所示的界面中,單擊“輸入對話框”按鈕就能彈出如圖所示的輸入對話框,這個(gè)輸入對話框上有一個(gè)下拉框。如果使用前5個(gè)版本的showInputDialog()方法,則可以彈出一個(gè)帶有文本框的輸入對話框,讀者可以自行嘗試實(shí)現(xiàn)。
20.7.4內(nèi)部信息對話框
內(nèi)部信息對話框是從指某個(gè)容器上彈出的對話框,這個(gè)對話框不能離開彈出它的容器。實(shí)際上,通過getContentPane()方法獲得的內(nèi)容面板實(shí)際上就是一個(gè)容器,從這個(gè)容器上彈出的對話框不能在容器以外的范圍內(nèi)顯示。內(nèi)部對話框也分為3種,與普通的系統(tǒng)對話框一一對應(yīng)。為與彈出普通對話框的方法相區(qū)別,彈出內(nèi)部信息對話框的方法名稱中會增加一個(gè)單詞“Internal”,例如內(nèi)部信息確認(rèn)對話框的方法是showInternalConfirmDialog()。
彈出內(nèi)部信息對話框時(shí),會把“父組件”指定為一個(gè)容器而不是窗體對象本身。下面的【例20_25】展示了如何彈出一個(gè)內(nèi)部信息對話框。
【例20_25 內(nèi)部信息對話框】
Exam20_25.java
import java.awt.*;import java.awt.event.*;import javax.swing.*;class Exam20_25Frame extends JFrame{ JButton button; public Exam20_25Frame(){ init(); } private void init( ){ Container container = this.getContentPane(); container.setLayout(null); button = new JButton("內(nèi)部信息對話框"); button.setSize(200, 40); button.setLocation(50,20); button.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //彈出內(nèi)部信息對話框 JOptionPane.showInternalMessageDialog(container, "內(nèi)部信息對話框"); } }); container.add(button); }}public class Exam20_25{ public static void main(String[] args) { Exam20_25Frame frame = new Exam20_25Frame(); frame.setSize(320, 150); frame.setLocationRelativeTo(null); frame.setTitle("Exam20_25Frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}【例20_25】的運(yùn)行結(jié)果如圖20-26所示。
圖20-26【例20_25】運(yùn)行結(jié)果
在窗體上單擊“內(nèi)部信息對話框按鈕”就可以彈出一個(gè)內(nèi)部信息對話框,從圖20-26可以很明顯的看出:內(nèi)部信息對話框無法超出彈出它的容器。
20.7.5自定義對話框
?在Swing體系中,用JDialog類來表示對話框,無論是系統(tǒng)對話框還是自定義對話框都使用這個(gè)類來表示。前文之所以在介紹系統(tǒng)對話框時(shí)沒有給讀者介紹這個(gè)類,就是因?yàn)槌绦騿T如果希望彈出一個(gè)系統(tǒng)對話框,只需要調(diào)用JOptionPane類的靜態(tài)方法就可以了,而這些靜態(tài)方法在實(shí)現(xiàn)彈出對話框的過程中實(shí)際上就是創(chuàng)建了一個(gè)JDialog類的對象。各位讀者可以把JDialog理解為一種特殊的窗體,之所以說它特殊,就是因?yàn)樗荒芟衿胀ù绑w那樣實(shí)現(xiàn)最大化、最小化以及修改大小的操作。程序員創(chuàng)建一個(gè)自定義的對話框和創(chuàng)建一個(gè)窗體的過程是一樣的:只要定義一個(gè)類并且讓這個(gè)類繼承JDialog就可以了。當(dāng)創(chuàng)建出自定義對話框類對象后,調(diào)用其setVisible()方法并為方法傳遞參數(shù)true就能夠把自定義對話框顯示出來。
對話框分為“模態(tài)對話框”和“非模態(tài)對話框”,所謂“模態(tài)對話框”是指當(dāng)對話框彈出后,用戶無法操作彈出它的窗體上的任何組件,例如之前介紹的消息對話框、確認(rèn)對話框都屬于模態(tài)對話框,而非模態(tài)對話框則沒有這個(gè)限制。自定義對話框上往往會出現(xiàn)文本框等組件,程序員如果希望獲得自定義對話框上組件的內(nèi)容,就必須把自定義對話框設(shè)置為模態(tài)對話框。設(shè)置模態(tài)對話框的方法是setModal(),只需要為該方法傳遞true作為參數(shù)就能夠把一個(gè)自定義對話框設(shè)置為模態(tài)對話框。需要注意:模態(tài)對話框一旦被顯示,也就是說當(dāng)模態(tài)對話框執(zhí)行了setVisible()方法并為方法傳遞參數(shù)true后,setVisible()之后的語句將暫停執(zhí)行,因此一般都會把調(diào)用模態(tài)對話框setVisible()方法的語句置于整個(gè)初始化方法的最后一行。
通常情況下,自定義的模態(tài)對話框都會用來用戶所輸入的信息。程序員可以在自定義對話框中定義一個(gè)收集信息的方法,當(dāng)關(guān)閉對話框后通過調(diào)用這個(gè)方法來收集用戶所填寫的信息。
下面的【例20_26】展示了如何彈出一個(gè)自定義對話框并獲取對話框上文本框中的信息。在這個(gè)例子中,以MyDialog類作為自定義對話框,并以MyDialog類的getValue()作為收集用戶所填寫信息的方法。
【例20_26 自定義對話框】
Exam20_26.java
import java.awt.*;import java.awt.event.*;import javax.swing.*;//自定義對話框類class MyDialog extends JDialog{ JTextField txtUserName; JPasswordField pwdPassword; JButton btnOk,btnCancel; JLabel lblUserName, lblPassword; String value = null; public MyDialog(Frame owner, String title){ super(owner, title); init(); } private void init( ){ Container container = this.getContentPane(); container.setLayout(null); txtUserName = new JTextField(); pwdPassword = new JPasswordField(); btnOk = new JButton("確定"); btnCancel = new JButton("取消"); lblUserName = new JLabel("用戶名"); lblPassword = new JLabel("密 碼"); this.setSize(300,200); this.setLocationRelativeTo(null); lblUserName.setSize(80, 30); lblUserName.setLocation(30, 20); lblUserName.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); txtUserName.setSize(140, 30); txtUserName.setLocation(110, 20); txtUserName.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); lblPassword.setSize(80, 30); lblPassword.setLocation(30, 60); lblPassword.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); pwdPassword.setSize(140, 30); pwdPassword.setLocation(110, 60); pwdPassword.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); btnOk.setSize(80, 30); btnOk.setLocation(50, 100); btnOk.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); btnOk.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //獲取用戶填寫的用戶名和密碼并賦值給value value = "用戶名:"+txtUserName.getText() +"密碼:"+new String(pwdPassword.getPassword()); //關(guān)閉對話框 MyDialog.this.dispose(); } }); btnCancel.setSize(80, 30); btnCancel.setLocation(150, 100); btnCancel.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); btnCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { MyDialog.this.dispose(); } }); container.add(txtUserName); container.add(pwdPassword); container.add(btnOk); container.add(btnCancel); container.add(lblUserName); container.add(lblPassword); //設(shè)置為模態(tài)對話框 this.setModal(true); this.setVisible(true); } //返回用戶填寫的信息 public String getValue(){ return value; }}//窗體類class Exam20_26Frame extends JFrame{ JButton button; public Exam20_26Frame(){ init(); } private void init( ){ Container container = this.getContentPane(); container.setLayout(null); button = new JButton("自定義對話框"); button.setSize(200, 40); button.setLocation(50,20); button.setFont(new Font("微軟雅黑", Font.PLAIN, 20)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //彈出內(nèi)部信息對話框 MyDialog myDialog = new MyDialog(Exam20_26Frame.this,"自定義對話框"); //當(dāng)對話框關(guān)閉后執(zhí)行g(shù)etValue()方法 String input = myDialog.getValue(); System.out.println(input); } }); container.add(button); }}public class Exam20_26 { public static void main(String[] args) { Exam20_26Frame frame = new Exam20_26Frame(); frame.setSize(320, 150); frame.setLocationRelativeTo(null); frame.setTitle("Exam20_26Frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}【例20_26】的運(yùn)行結(jié)果如圖20-27所示。
圖20-27【例20_26】運(yùn)行結(jié)果
在圖20-27所示窗體上單擊“自定義對話框”按鈕就會出現(xiàn)一個(gè)自定義對話框,當(dāng)用戶在該對話框中輸入用戶名和密碼后再單擊“確定”按鈕,控制臺上就會輸出用戶所填寫的用戶名和密碼。實(shí)現(xiàn)這一效果的關(guān)鍵是MyDialog類中定義了一個(gè)value屬性用于保存用戶名和密碼,當(dāng)關(guān)閉對話框后,調(diào)用getValue()方法獲得用戶名和密碼。?
本文字版教程還配有更詳細(xì)的視頻講解,小伙伴們可以??點(diǎn)擊這里??觀看。
標(biāo)簽: 內(nèi)部信息 對話框標(biāo)題