【環(huán)球播資訊】第二十章《Java Swing》第7節(jié):對話框

2023-01-04 12:11:37 來源:51CTO博客

對話框是桌面應(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)對話框和自定義對話框的使用。

20.7.1消息對話框

消息對話框用于向用戶傳達(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)題

上一篇:要聞速遞:Linux 上 Nginx 獲得最佳性能的 8 種方法
下一篇:第二十章《Java Swing》第6節(jié):中間容器