1. 程式人生 > >56、彈出框和多個視窗之間的切換

56、彈出框和多個視窗之間的切換

學習目標:

1、掌握使用Swing實現彈出框功能

2、使用Swing切換視窗

3、新視窗的定義和彈出

 

學習過程:

一、彈出框

1、簡介

Java 中的對話方塊是一個容器,它充當父容器的子容器  Swing中的彈出式對話方塊是用JOptionPane實現的, 通過showXXXDialog()來顯示.其方式都是靜態的。JOptionPane 可用於顯示各種圖示,如用於警告訊息、問題、錯誤和資訊等的圖示。JOptionPane 這個類支援的功能有:

  • 佈局標準對話方塊;

  • 指定對話方塊的標題和文字。

  • 提供圖示和自定義按鈕文字。

2、型別

彈出框的樣式一共有四種:

ConfirmDialog:確認對話方塊(有類似Yes,No等按鈕的那種).你也可以傳不同的引數進去來改變顯示的按鈕和icon

MessageDialog:顯示訊息    

InputDialog:文字輸入對話方塊

OptionDialog:自定義對話方塊(組合以上三種對話方塊的型別)

3、方法引數如下:

ParentComponent:對話方塊的父視窗物件。如果為null則採用預設的Frame作為父視窗,此時對話方塊將設定在螢幕的正中。

message:顯示的訊息文字.其實可以是任何的物件.(我今天無意中把窗體上的JMenuBar對像傳進去它顯示的就是JMenuBar)

title:標題文字

Component:中顯示的元件(如按鈕)

Icon:顯示的圖示(如感嘆號)

messageType:一般可以為如下的值ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE

optionType:它決定在對話方塊的底部所要顯示的按鈕選項。一般可以為DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION

二、使用例項

先新建一個主介面,放置四個按鈕,我們分別彈出四個不同的彈出框。主介面如下:

attcontent/2d2836f7-18e8-4025-b764-d529d664db81.png

1、顯示訊息對話方塊MessageDialog。把tp01.png圖片複製到與類同一個包裡面就行了。繫結按鈕事件,輸入一下程式碼。

1

2

3

4

// 訊息對話方塊

Icon icon = new ImageIcon(this.getClass().getResource("tq01.png"));

JOptionPane.showMessageDialog(this"出錯了""標題",

                JOptionPane.ERROR_MESSAGE, icon);

點選按鈕訊息框效果如下:

attcontent/730c8f6f-2957-42ec-b25a-9ebeff4a25fb.png

2、顯示確認對話方塊ConfirmDialog。同樣繫結事件,程式碼如下:

1

2

3

4

5

6

7

8

9

10

 // 通過返回值知道使用者點選了是還是否

int result = JOptionPane.showConfirmDialog(this"是否要退出系統""標題",

                JOptionPane.OK_CANCEL_OPTION);

 

if (result == JOptionPane.OK_OPTION) {

     // System.out.println("確認退出");

     this.dispose();// 釋放資源

else {

     System.out.println("取消");

}

顯示如下:

attcontent/5124d763-53bd-468b-9add-7452152edde4.png

3、顯示InputDialog。可以讓使用者進行輸入,並會的使用者輸入的內容。程式碼如下:

1

2

3

4

5

6

7

String input = JOptionPane.showInputDialog(this"提示資訊""初始化值");

 

if (input != null) {

    // 使用者點選確定

    System.out.println("使用者輸入的值:" + input);

 

}

顯示如下:

attcontent/ab3832d8-950e-4d4e-9e5c-8923a7a73e75.png

4、顯示OptionDialog。該種對話方塊可以由使用者自己來設定各個按鈕的個數並返回使用者點選各個按鈕的序號(從0開始計數)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Object[] options = { "XX""取消""幫助""退出" };

 

int result = JOptionPane.showOptionDialog(this"提示資訊""標題",

                JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, null,

                options, 3);

 

switch (result) {

     case 0:

        System.out.println("點選了第1個按鈕");

        break;

     case 1:

        System.out.println("點選了第2個按鈕");

        break;

     case 2:

        System.out.println("點選了第3個按鈕");

        break;

 

     default:

        System.out.println("點選了第4個按鈕");

        break;

}

顯示如下:

attcontent/f695d094-6d4f-4e3a-8d76-0269ec7d2f8d.png

二、多個視窗之間的切換和引數傳遞

1、視窗切換和引數傳遞

視窗切換比較簡單,只需要把當前構造一個新視窗,然後呼叫setVisible(true)方法就可以了。如果本視窗已經不需要了,那麼可以呼叫this.dispose()方法,釋放自己。

視窗直接進行傳參也很簡單,因為視窗就是一個類檔案,我們可以通過構造方法在視窗直接傳參,也可以在視窗類中定義一個全域性變數,使用get/set方法進行引數的傳遞。

1

2

3

4

5

  //2、開啟新視窗  

//通過構造方法傳遞使用者名稱稱

MainFrame mainFrame=new MainFrame(name);

this.dispose();//釋放自己

mainFrame.setVisible(true);//顯示新框框

2、居中顯示

估計大家也發現了。我們現在彈出的所有視窗都是在左上角顯示,我們可以使用setLocation方法指定視窗在螢幕的那個位置顯示。setLocation方法之需要傳入螢幕的座標(x和y)就可以了。修改上面的程式碼。

1

2

3

4

   MainFrame mainFrame=new MainFrame(name);

this.dispose();//釋放自己

mainFrame.setLocation(100100);

mainFrame.setVisible(true);//顯示新框框

這樣新視窗就不是在左上角顯示了。但是我們的要求是想要視窗居中顯示,所以這裡需要做一點簡單的演算法,計算視窗在中間顯示的座標位置是多少?我們搜先要知道在計算機螢幕的座標和我們初中時候學習的平面座標差不多,唯一的區別是Y軸是向下的。參考下圖:

attcontent/b1746806-e1e4-4d43-bcea-9b69f8b0ab4f.png

如果每一個視窗都要這樣計算,還是比較麻煩的,我們可以封裝一個居中顯示視窗類,實現程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

 public class FrameUtil {

    public static void centerShowJFrame(Component component) {

        // 獲得螢幕的大小

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        // 獲得視窗的大小

        Dimension frameSize = component.getSize();

 

        // 如果視窗的大小比螢幕的要大,就用螢幕的賦值給視窗的。

        if (frameSize.height > screenSize.height) {

            frameSize.height = screenSize.height;

        }

        if (frameSize.width > screenSize.width) {

            frameSize.width = screenSize.width;

        }

 

        // 設定視窗的顯示位置居中。

        component.setLocation((screenSize.width - frameSize.width) / 2,

                (screenSize.height - frameSize.height) / 2);

 

        // 顯示視窗

        component.setVisible(true);

    }

}

修改上面的程式碼如下:

1

2

3

4

5

6

7

8

9

// 2、開啟新視窗 //通過構造方法傳遞使用者名稱稱

MainFrame mainFrame = new MainFrame(name);

this.dispose();// 釋放自己

 

FrameUtil.centerShowJFrame(mainFrame);//居中顯示

/*

     mainFrame.setLocation(100, 100);

    mainFrame.setVisible(true);//顯示新框框

*/

現在彈出的視窗就都是居中的了。