Java學習之GUI(圖形用戶界面)

一、GUI 概述

1、概述:

1、GUI:Graphical User Interface,即圖形用戶界面,用于計算機與用戶交互的一種方式

2、計算機與用戶交互的形式:GUI和CLI
GUI: Graphical User Interface,圖形用戶接口,用圖形方式,來顯示計算機操作界面,方便直觀。
CLI: Command Line User Interface,命令行用戶接口,即常見的Dos命令行操作,須記住一些命令,不直觀。

3、java也將這種界面封裝為對象,其中的對象都放在了兩個包中:java.Awt包和javax.Swing包。
java.Awt包:Abstract Window Toolkit,即抽象窗口工具箱。要調(diào)用本地系統(tǒng)方法實現(xiàn)功能,屬重量級控件。
javax.Swing包:在AWT的基礎(chǔ)上建立的一套圖形界面系統(tǒng),其中提供了更多的組件,且完全有java實現(xiàn),增強了移植性,屬輕量級控件。

2、繼承體系:

繼承體系示意圖

Container是一個容器,通過add方法添加組件

3、布局管理器:

1、布局:容器中的組件排列方式

2、常見的布局管理器:
1)FlowLayout:流式布局管理器,從左向右排列,是Panel默認的布局管理器
2)BorderLayout:邊界式布局管理器,東南西北中的排列方式,是Frame的默認布局管理器
3)GridLayout:網(wǎng)格式布局管理器,規(guī)則的矩陣
4)CardLayout:卡片式布局管理器,即選項卡
5)GridBayLayout:網(wǎng)格包布局管理器,非規(guī)則矩陣

3、如果存在多種布局方式,如何創(chuàng)建窗體界面呢?步驟:
1)先將窗體Frame進行大區(qū)域的劃分,設(shè)置其布局管理器,加入面板Panel
2)將組建加入Panel,設(shè)置面板的布局管理器

示例:

import java.awt.*;  
import java.awt.event.*;  
  
class FrameDemo{  
    //定義該圖形中所需的組件引用  
    private Frame f;  
    private Button but;  
    FrameDemo(){  
        init();  
    }  
    //初始化組件  
    public void init(){  
        //對frame進行基本設(shè)置  
        f = new Frame("my frame");  
        f.setBounds(300,100,600,500);  
        f.setLayout(new FlowLayout());  
  
        but = new Button("button");  
        //將組件添加進窗體  
        f.add(but);  
        //加載一下窗體上事件  
        myEvent();  
        //顯示窗體  
        f.setVisible(true);  
    }  
    //窗體事件  
    private void myEvent(){  
        f.addWindowListener(new WindowAdapter(){  
            public void windowClosing(WindowEvent e){  
                System.exit(0);  
        }});  
        //讓按鈕具備退出程序的功能  
        but.addActionListener(new ActionListener(){  
            public void actionPerformed(ActionEvent e){  
                System.out.println("button 關(guān)閉的窗口");  
                System.exit(0);  
        }});  
    }  
    public static void main(String[] args)   
    {  
        new FrameDemo();  
    }  
}

4、創(chuàng)建圖形化界面思路:

1、創(chuàng)建Frame容器:Frame f = new Frame("my Frame");可設(shè)置標題

2、對窗體進行設(shè)置:如大小,位置,布局等。
f.setSize(int wight,int hight);
f.setLocation(int x,int y),設(shè)置橫縱坐標;
f.setBounds(int wight,int hight,int x,int y),者直接用這個對大小和位置設(shè)置
f.setLayout(Layout layout),參數(shù)為指定的布局管理器,如FlowLayout

3、定義組件:如Button b = new Button(“Button”),可設(shè)置組件的名稱

4、將組件通過窗體的add方法添加到窗體中,f.add(b);

5、讓窗體顯示,通過setVisible(boolean b),通過設(shè)置參數(shù)是true還是false是否顯示窗體

5、事件監(jiān)聽機制

一)的特點:
1、事件源(組件):awt或swing包中的那些圖形界面組件

2、事件(Event):每一個事件源都有自己特有的對應(yīng)的時間和共性事件

3、監(jiān)聽器(Listener):將可觸發(fā)某一事件的動作(不止一個),都封裝到監(jiān)聽器中。注意,是動作封裝到監(jiān)聽器中。

4、事件處理:引發(fā)事件后的處理方式。

事件處理示意圖

二)說明:
前三個在java中都已將定義好了,直接獲取其對象來用即可,我們需要做的就是對產(chǎn)生的動作進行處理,步驟:
1、明確監(jiān)聽器(Frame)將監(jiān)聽器注冊到上面,通過方法:addWindowListener(WindowListener w)
2、注意:若用子類實現(xiàn)WindowListener接口,就需要覆蓋其中的7個方法,可只用到其中的關(guān)閉動作,其他動作未用到,就必須重寫全部,因為WindowLister的子類WindowAdapter以實現(xiàn)此接口,并覆蓋了其中所有方法,則只需繼承WindowAdapter,覆蓋需要的方法即可。
3、明確事件,并對事件進行處理,其實,添加什么監(jiān)聽器就需要添加什么事件。

示例一:鼠標和鍵盤事件

import java.awt.*;  
import java.awt.event.*;  
class MouseAndKeyEvent  
{  
    //創(chuàng)建全局變量  
    private Frame f = null;  
    private Button but = null;  
    private TextField tf;  
    //初始化窗體  
    MouseAndKeyEvent(){  
        init();  
    }  
    //創(chuàng)建窗體  
    public void init(){  
        f = new Frame("my frame");  
        f.setBounds(300,200,600,500);  
        f.setLayout(new FlowLayout());  
        tf = new TextField(20);  
        but = new Button("button");  
        f.add(tf);  
        f.add(but);  
        myEvent();  
        f.setVisible(true);  
    }  
    //注冊事件  
    private void myEvent(){  
        //添加監(jiān)聽器,引發(fā)退出事件  
        f.addWindowListener(new WindowAdapter(){  
            public void windowClosing(WindowEvent e){  
                System.exit(0);  
        }});  
        //給but添加一個活動監(jiān)聽器  
        but.addActionListener(new ActionListener(){  
            public void actionPerformed(ActionEvent e){  
                System.out.println("action ok");  
        }});  
        //給文本框添加一個監(jiān)聽器,引發(fā)鍵盤事件  
        tf.addKeyListener(new KeyAdapter(){  
            public void keyPressed(KeyEvent e){  
                int code = e.getKeyCode();  
                System.out.println(e.getKeyChar() + "..." + e.getKeyChar());  
                if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)){  
                    e.consume();  
                    System.out.println(code + "是非法的");  
        }});  
  
        //鼠標事件  
        //myMouseEvent();  
        //鍵盤事件  
        myKeyEvent();  
    }  
    //鼠標事件  
    public void myMouseEvent(){  
        //給but添加一個鼠標監(jiān)聽器  
        but.addMouseListener(new MouseAdapter(){  
            private int count = 1;  
            private int clickCount = 1;  
            private int clickCount2 = 1;  
            public void mouseEntered(MouseEvent e){  
                System.out.println("鼠標進入該組件" + count++);  
            }  
            public void mouseClicked(MouseEvent e){  
                if(e.getClickCount()==2)  
                    System.out.println("雙擊動作"  + clickCount2++);  
                    //System.out.println("點擊動作" + clickCount++);  
        }});  
    }  
    //鍵盤事件  
    public void myKeyEvent(){  
        //給but添加一個鍵盤監(jiān)聽器  
        but.addKeyListener(new KeyAdapter(){  
            public void keyPressed(KeyEvent e)  
            {  
                //組合鍵ctrl鍵和回車鍵同時觸發(fā)  
                if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)  
                    System.out.println("ctrl+enter is runing");  
                //System.out.println(e.getKeyChar() + "..." + e.getKeyCode());  
                //System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + "..." + e.getKeyChar());  
            }  
        });  
    }  
  
    public static void main(String[] args)   
    {  
        new MouseAndKeyEvent();  
    }  
}

二、應(yīng)用

1、何時需要產(chǎn)生對話框:

此對象時需要在調(diào)用時,才創(chuàng)建對象的,如:當在誤操作的時候,就會出現(xiàn)提示錯誤信息的對話框,此時才創(chuàng)建的這個對象。

2、菜單:Menu

1、Menu:菜單,Menu extends MenuItem;有右三角的圖標存在,可添加Menu和MenuItem
2、MenuBar:菜單欄,可添加菜單和條目
3、MenuItem:條目,及菜單項目,無右三角的圖標存在,是最終的菜單項。
4、菜單的事件處理和組件一樣,可以對類型為MenuItem和Menu的對象這個事件源添加活動監(jiān)聽ActionListener,并進行相關(guān)的事件處理。
示例:

3、jar包雙擊執(zhí)行:

既然是圖形化界面,就需要通過圖形化界面的形式運行程序,而不是是用Dos命令行執(zhí)行,那么如何通過雙擊程序就執(zhí)行程序呢?這就需要將程序的class文件打包,
步驟如下:
1、首先要在Java文件中導(dǎo)入一個包,沒有則需創(chuàng)建一個包,如package mymenu;

2、生成包:通過編譯javac -d c:\myclass MyMenu.java,此時則在c盤下的myclass文件夾下生成了所有的.class文件

3、在此目錄下新建一個文件,如1.txt或者其他任意名稱任意擴展名的文件都可,然后在其中編輯固定的格式:“Main-Class: mymenu.MenuDemo”,只寫引號中的內(nèi)容。需要需要在冒號后有一個空格,在文件末尾要回車。

4、編譯:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,則直接編譯jar即可得出相應(yīng)的命令

5、此時雙擊即可執(zhí)行。

說明:
1)在固定格式中:
a.如果無空格:在編譯的時候,就會報IO異常,提示無效的頭字段,即invalid header field。這說明1.txt在被IO流讀取。
b.如果無回車:在列表清單.MF中不會加入相應(yīng)的加載主類的信息,也就是說配置清單的屬性主類名稱不會加載進清單中,也就不會執(zhí)行。

2)jar文件必須在系統(tǒng)中注冊,才能運行。注冊方法如下:
A.對于XP系統(tǒng):
a.打開任意對話框,在菜單欄點擊工具按鈕,選擇文件夾選項
b.選擇新建--->擴展名,將擴展名設(shè)置為jar,確定
c.選擇高級,可更改圖標,然后點擊新建,命名為open,
d.在用于可執(zhí)行應(yīng)用程序中,點瀏覽,將jdk下的bin的整個文件路徑添加進來,并在路徑后添加-jar即可。
B.對于win7系統(tǒng):
a.改變打開方式:右擊.jar文件,點擊打開方式,選擇默認程序為jdk下bin中的javaw.exe應(yīng)用程序。
b.修改關(guān)聯(lián)程序的注冊表:打開注冊表(win+r),找到注冊表路徑\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command下的字符串值,右擊點修改,將值改為:"C:\Program Files\Java\jre6\bin\javaw.exe" -jar "%1"其中-jar前的路徑就是javaw.exe的路徑。保存
c.雙擊即可執(zhí)行jar程序,如果仍不能執(zhí)行,則需下載最新版的jdk。

示例一:
打開指定目錄下的目錄條目

import java.awt.*;  
import java.awt.event.*;  
import java.io.*;  
  
class  MyWindowDemo  
{  
    //創(chuàng)建全局變量  
    private Frame f;  
    private Button but;  
    private TextField tf;  
    private TextArea ta;  
  
    private Dialog d;  
    private Label lab;  
    private Button okBut;  
  
    //構(gòu)造函數(shù),初始化窗體  
    MyWindowDemo()  
    {  
        init();  
    }  
    //創(chuàng)建窗體和組件,并將事件添加進來  
    public void init()  
    {  
        //設(shè)置窗體  
        f = new Frame("my window");  
        f.setBounds(300,200,600,500);  
        f.setLayout(new FlowLayout());  
        //創(chuàng)建組件  
        but = new Button("轉(zhuǎn)到");  
        tf = new TextField(60);  
        ta = new TextArea(25,75);  
  
        d = new Dialog(f,"提示信息-self",true);  
        d.setBounds(300,100,300,150);  
        d.setLayout(new FlowLayout());  
        lab = new Label();  
        okBut = new Button("確定");  
  
        //將組件添加到窗體  
        f.add(tf);  
        f.add(but);  
        f.add(ta);  
          
        d.add(lab);  
        d.add(okBut);  
  
        //添加事件  
        myEvent();  
        //設(shè)置窗體可見  
        f.setVisible(true);  
    }  
    //常見引發(fā)的時間  
    private void myEvent()  
    {  
        //給but添加一個活動監(jiān)聽器  
        but.addActionListener(new ActionListener()  
        {  
            public void actionPerformed(ActionEvent e)  
            {  
                showInfo();  
            }  
        });  
        okBut.addActionListener(new ActionListener()  
        {  
            public void actionPerformed(ActionEvent e)  
            {  
                d.setVisible(false);  
            }  
        });  
        //給文本框添加鍵盤事件  
        tf.addKeyListener(new KeyAdapter()  
        {  
            public void keyPressed(KeyEvent e)  
            {  
                if(e.getKeyCode()==KeyEvent.VK_ENTER)  
                    showInfo();  
            }  
        });  
        //關(guān)閉窗體事件  
        f.addWindowListener(new WindowAdapter()  
        {  
            public void windowClosing(WindowEvent e)  
            {  
                System.exit(0);  
            }  
        });  
        //給對話框添加一個監(jiān)聽器,關(guān)閉對話框事件  
        d.addWindowListener(new WindowAdapter()  
        {  
            public void windowClosing(WindowEvent e)  
            {  
                d.setVisible(false);  
            }  
        });  
    }  
    //操作文件,對文件夾的內(nèi)容讀取  
    private void showInfo()  
    {  
        String dirPath = tf.getText();  
        File file = new File(dirPath);  
        if(file.exists()&&file.isDirectory())  
        {  
            ta.setText("");  
            String[] names = file.list();  
            for(String name : names)  
            {  
                ta.append(name + "\r\n");  
            }  
        }  
        else  
        {  
            String info = "您輸入的:“"+dirPath+"”是錯誤的路徑,請重輸";  
            lab.setText(info);  
            d.setVisible(true);  
        }  
    }  
  
    public static void main(String[] args)   
    {  
        new MyWindowDemo();  
    }  
}

示例二:
打開文件,將內(nèi)容顯示在文本框中,并將寫入文本框中的內(nèi)容保存

/* 
菜單練習 
 
*/  
package mymenu;  
import java.awt.*;  
import java.awt.event.*;  
import java.io.*;  
public class MenuDemo   
{  
    //設(shè)置全局變量  
    private Frame f;  
    private MenuBar bar;  
    private TextArea ta;  
    private Menu fileMenu;  
    private MenuItem closeMT,submu,openItem,saveItem;  
  
    private FileDialog openDia,saveDia;  
  
    private File file;  
      
    //初始化菜單項  
    MenuDemo()  
    {  
        init();  
    }  
    //初始化窗體和組件  
    public void init()  
    {  
        //初始化窗體frame  
        f = new Frame("my Menu");  
        f.setBounds(300,100,600,500);  
          
        //初始化菜單項  
        bar = new MenuBar();  
        ta = new TextArea();  
        fileMenu = new Menu("文件");  
        submu = new MenuItem("子條目");  
        openItem = new MenuItem("打開");  
        saveItem = new MenuItem("保存");  
        closeMT = new MenuItem("退出");  
          
        //將組件加入到文件菜單這個容器組件中  
        fileMenu.add(submu);  
        fileMenu.add(openItem);  
        fileMenu.add(saveItem);  
        bar.add(fileMenu);  
        f.setMenuBar(bar);  
        fileMenu.add(closeMT);  
  
        openDia = new FileDialog(f,"我要打開",FileDialog.LOAD);  
        saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);  
          
        f.add(ta);  
        //添加事件  
        myEvent();  
        //設(shè)置窗體可見性  
        f.setVisible(true);  
    }  
      
    //添加事件  
    private void myEvent()  
    {  
        //添加窗體監(jiān)聽,關(guān)閉按鈕  
        f.addWindowListener(new WindowAdapter()  
        {  
            public void windowClosing(WindowEvent e)  
            {  
                System.exit(0);  
            }  
        });  
        //添加退出菜單項目的監(jiān)聽,退出程序  
        closeMT.addActionListener(new ActionListener()  
        {  
            public void actionPerformed(ActionEvent e)  
            {  
                System.exit(0);  
            }  
        });  
        //添加打開和保存文件的監(jiān)聽,獲取文件  
        //打開事件  
        openItem.addActionListener(new ActionListener()  
        {  
            public void actionPerformed(ActionEvent e)  
            {  
                //顯示對話框,并獲取文件路徑及文件名  
                openDia.setVisible(true);  
                String dirPath = openDia.getDirectory();  
                String fileName = openDia.getFile();  
                //判斷文件及路徑是否存在  
                if(dirPath==null || fileName==null)  
                    return ;  
                //在打開一個文件前先清空文本框的內(nèi)容  
                ta.setText("");  
                file = new File(dirPath,fileName);  
                BufferedReader bufr = null;  
                try  
                {  
                    //讀取文件中的內(nèi)容  
                    bufr = new BufferedReader(new FileReader(file));  
                    String line = null;  
                    while((line=bufr.readLine())!=null)  
                    {  
                        ta.append(line+"\r\n");  
                    }  
                }  
                catch (IOException ex)  
                {  
                    throw new RuntimeException("讀取失敗");  
                }  
                finally  
                {  
                    try  
                    {  
                        if(bufr!=null)  
                            bufr.close();  
                    }  
                    catch (IOException ex)  
                    {  
                        throw new RuntimeException("關(guān)閉流失敗");  
                    }  
                }  
            }  
        });  
  
        //保存事件  
        saveItem.addActionListener(new ActionListener()  
        {  
            public void actionPerformed(ActionEvent e)  
            {  
                if(file==null)  
                {  
                    //顯示對話框,并獲取文件名及路徑  
                    saveDia.setVisible(true);  
                    String dirPath = saveDia.getDirectory();  
                    String fileName = saveDia.getFile();  
                    if(dirPath==null || fileName==null)  
                        return ;  
                    file = new File(dirPath,fileName);  
                    BufferedWriter bufw = null;  
                    try  
                    {  
                        //寫入文本框中的內(nèi)容  
                        bufw = new BufferedWriter(new FileWriter(file));  
                        String text = ta.getText();  
                        bufw.write(text);  
                        bufw.flush();                             
                    }  
                    catch (IOException ex)  
                    {  
                        throw new RuntimeException("寫入失敗");  
                    }  
                    finally  
                    {  
                        try  
                        {  
                            if(bufw!=null)  
                                bufw.close();  
                        }  
                        catch (IOException ex)  
                        {  
                            throw new RuntimeException("關(guān)閉流失敗");  
                        }  
                    }  
                }  
            }  
        });  
  
    }  
    public static void main(String[] args)   
    {  
        new MenuDemo();  
    }  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,979評論 25 709
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,424評論 0 2
  • 面向?qū)ο笾饕槍γ嫦蜻^程。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,220評論 0 4
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,322評論 0 17
  • 從今天開始記錄陪伴孩子的點點滴滴~5月18日晚老公和兒子一起去機場接我,對于方向感不好的我來說,告訴他們我的位置就...
    有你的生活更美好閱讀 470評論 0 0

友情鏈接更多精彩內(nèi)容