1. 程式人生 > >黑馬程式設計師--Java基礎--awt詳解以及簡單應用

黑馬程式設計師--Java基礎--awt詳解以及簡單應用

GUI
圖形使用者介面
CLI
命令列使用者介面
Java為GUI提供的物件存在java.Awt和Javax.Swing兩個包中.
Java當中如何完成圖形化介面的製作呢?
AWT:abstract Window ToolKit.需要呼叫本地系統實現功能.屬於重量級控制元件.依賴於平臺.跨平臺性不是特別好.
Javax.Swing:在AWT基礎上.建立一套圖形化系統,提供更多元件,完全由java實現,增強了可移植性,屬於輕量級控制元件.所以以後最好用Swing開發.
還有一個SWT外觀包.

這裡寫圖片描述
Lable用來封裝文字.CheckBox複選框.TextComponent:文字元件.
Container: 容器,是一個特殊的元件,可以通過add方法來新增其他元件進來.
Window:Frame框架.Dialog:對話方塊.FileDialog:檔案對話方塊就是打負責檔案的選取和儲存的視窗.
容器中的元件的排放方式,就是佈局.
Panel:面板
常見的佈局管理器:
FlowLayout:流式佈局管理器.先放中間.第二次放右邊.預設居中.
從左到右.
Panel預設的佈局管理器
BorderLayout:邊界式佈局
上下左右打麻將.如果不指定方向,那麼會居中直接填滿整個視窗.新增新元件就覆蓋原元件.
GridLayout:網格式佈局
每個元件都存放在格子當中,計算器就是一個GridLayout.
GridBagLayout:網格包佈局管理器.
CardLayout:卡片式佈局:

建立圖形化介面:

1. 建立Frame窗體
2. 對窗體進行基本設定,比如大小位置和佈局
3. 定義元件
4. 將元件通過窗體的add()新增到窗體中
5. 讓窗體顯示,通過setVisible(true);方法

事件監聽機制:

1. 事件源:圖形介面元件.
2. 事件:Event.每一個事件源都有自己的特有的對應事件和共性事件.
3. 監聽器:可以觸發某一個事件的動作都已經封裝到了監聽器中,

以上三者在Java中都定義好了,直接獲取其物件就可以了.我們要做的事情就是對產生的動作進行處理.

這裡寫圖片描述

這裡寫圖片描述

新增監聽器:f.add(WindowListener wl)
WindowListener的一個抽象子類 WindowAdapter,已經實現了介面,覆蓋了其中所有方法,只要繼承WindowAdapter覆蓋自己需要的方法即可!
一般開發awt要匯入兩個包: java.awt.*;java.awt.event.*;

要讓按鈕具備退出的功能,那麼按鈕就是事件源,新增一個監聽器.ActionListener是少數沒有Adapter類的其中一個.因為它裡面只有一個方法,直接實現即可.ActionPerfored(ActionEvent ae);

滑鼠事件和鍵盤事件:
AddKeyListener
AddMouseListener
此時點選按鈕誰會先執行?
滑鼠動作先.

下面我們來動手做一些圖形化介面:
例項1

package guiDemos;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event
.WindowAdapter; import java.awt.event.WindowEvent; public class AwtDemo1 { public static void main(String[] args) { Frame f = new Frame("my awt"); f.setLayout(new FlowLayout()); f.setVisible(true); f.setSize(300,200); f.setLocation(700, 400); Button b = new Button("我是一個按鈕");//定義一個按鈕,名稱為"我是一個按鈕" f.add(b); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.out.println("我關!"); System.exit(0); //點選右上角關閉按鈕,退出虛擬機器 } public void windowActivated(WindowEvent e1){ System.out.println("activated"); //每次視窗被啟用,列印"activated" } public void windowOpened(WindowEvent e2){ System.out.println("我活啦!"); //每次開啟視窗,會輸出"我活啦" } }); System.out.println("hello world!"); } } class myWindow extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.out.println("window closing"); e.getWindow(); System.out.println(e.toString()); System.out.println(e.getWindow()); System.out.println(e.getSource()); System.exit(0); } }

這裡寫圖片描述

例項2

package guiDemos;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameDemo {

    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        new Frame_Demo();
    }

}

class Frame_Demo {
    private Frame f;
    private Button but;

    Frame_Demo() {
        init();
    }

    public void init() {
        f = new Frame("myFrame");
        f.setBounds(1000, 500, 300, 400);
        f.setLayout(new FlowLayout());
        but = new Button("Run");
        myEvent();
        f.add(but);
        f.setVisible(true);
        but.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自動生成的方法存根
                System.out.println("button do");
                System.exit(0);
            }
        });
    }

    private void myEvent() {
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }

            public void windowOpened(WindowEvent e) {
                System.out.println("活了");
            }
        });
    }
}

這裡寫圖片描述
點選按鈕,打印出
這裡寫圖片描述

例項3

package guiDemos;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MouseKeyEventDemo {

    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        new mouseAndKey();
    }

}

class mouseAndKey {
    private Frame f;
    private Button but;
    private TextField tf;

    mouseAndKey() {
        init();
    }

    public void init() {
        f = new Frame("myFrame");
        f.setBounds(1000, 500, 300, 400);
        f.setLayout(new FlowLayout());
        but = new Button("Run");
        tf = new TextField(20);
        myEvent();
        f.add(tf);
        f.add(but);
        f.setVisible(true);
        tf.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                int code = e.getKeyCode(); //判斷輸入的鍵值是否為數字
                if (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {
                    System.out.println(code+"is illegal");
                    e.consume();
                }
            }
        });
        /*
         * but.addActionListener(new ActionListener() {
         * 
         * @Override public void actionPerformed(ActionEvent e) { // TODO
         * 自動生成的方法存根 System.out.println("button do"); System.exit(0); } });
         */
        but.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e) {
                System.out.println("entered");
            }

            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2)
                    System.out.println("雙擊動作");
            }
        });
        but.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (KeyEvent.getKeyText(e.getKeyCode()).equals("Q") && e.isControlDown())
                    System.exit(0);
                System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + "..." + e.getKeyChar());
                System.out.println("CTRL+Q");
            }
        });
    }

    private void myEvent() {
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }

            public void windowOpened(WindowEvent e) {
                System.out.println("活了");
            }
        });
    }
}

例項4

package guiDemos;

import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class MyMenuDemo {

    private Frame frame;
    private MenuBar bar;
    private Menu fileMenu, subMenu;
    private MenuItem closeItem, openItem, saveItem;
    private FileDialog openDlg, saveDlg;
    private TextArea ta;

    MyMenuDemo() {
        init();
    }

    public void init() {
        frame = new Frame("my Window");
        bar = new MenuBar();
        fileMenu = new Menu("檔案");
        openItem = new MenuItem("開啟");
        saveItem = new MenuItem("儲存");
        closeItem = new MenuItem("退出");
        ta = new TextArea();

        openDlg = new FileDialog(frame, "開啟檔案", FileDialog.LOAD);
        saveDlg = new FileDialog(frame, "儲存檔案", FileDialog.SAVE);

        frame.add(ta);
        fileMenu.add(openItem);
        fileMenu.add(saveItem);
        fileMenu.add(closeItem);

        bar.add(fileMenu);

        frame.setMenuBar(bar);
        frame.setBounds(700, 300, 600, 500);
        frame.setVisible(true);
        closeItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自動生成的方法存根
                System.exit(0);
            }
        });
        openItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自動生成的方法存根
                openDlg.setVisible(true);
                String fileName = openDlg.getDirectory() + openDlg.getFile();
                if (openDlg.getFile() != null) {
                    File f = new File(fileName);
                    // File fileName = new File(openDlg.getFile());
                    // ta.append(f.toString());
                    ta.setText("");
                    BufferedReader br = null;
                    try {
                        br = new BufferedReader(new FileReader(f));
                        String line = null;
                        while ((line = br.readLine()) != null) {
                            ta.append(line + "\r\n");
                        }
                    } catch (IOException e1) {
                        // TODO 自動生成的 catch 塊
                        e1.printStackTrace();
                    } finally {
                        try {
                            if (br != null)
                                br.close();
                        } catch (IOException e1) {
                            // TODO 自動生成的 catch 塊
                            e1.printStackTrace();
                        }
                    }
                }
            }
        });
        saveItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO 自動生成的方法存根
                saveDlg.setVisible(true);
                BufferedWriter bw = null;
                String fileName = saveDlg.getDirectory()+saveDlg.getFile();
                if(saveDlg.getFile()!=null)
                {
                     try {
                        bw = new BufferedWriter(new FileWriter(fileName));
                        String text = ta.getText();
                        bw.write(text);
                    } catch (IOException e1) {
                        // TODO 自動生成的 catch 塊
                        e1.printStackTrace();
                    }finally{
                        try {
                            if(bw!=null)
                                bw.close();
                        } catch (Exception e2) {
                            // TODO: handle exception
                        }
                    }
                }
            }
        });
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        new MyMenuDemo();
    }

}

選擇檔案後,文字區中顯示文字內內容,相當於一個windows小工具記事本
這裡寫圖片描述

例項5
寫一個程式,用於遍歷並資料夾中的所有內容

package guiDemos;

import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

public class MyWindowDemo {
    private Frame frame;
    private TextField tf;
    private Button but;
    private TextArea ta;
    private Dialog dlg;
    private Label lbl;
    private Button butOK;

    MyWindowDemo() {
        init();
    }

    public void init() {
        frame = new Frame("my Window");
        frame.setBounds(900, 400, 400, 500);
        frame.setLayout(new FlowLayout());

        tf = new TextField(30);
        but = new Button("轉到");
        ta = new TextArea(20, 40);

        frame.add(tf);
        frame.add(but);
        frame.add(ta);
        ta.setEditable(false);
        frame.setVisible(true);
        myEvent();
        tf.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e){
                if(KeyEvent.getKeyText(e.getKeyCode())=="Enter")
                    doFile();
            }
        });
        but.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                doFile();
            }
        });
    }

    private void doFile(){
        ta.setText("");
        File f = new File(tf.getText());
        if (!f.exists()) {
//          ta.setText("請重新輸入地址");
            dlg = new Dialog(frame, "輸入錯誤",false);
            lbl = new Label("\""+f.toString()+"\""+"不是一個有效路徑");
            butOK = new Button("確定");
            dlg.setLayout(new FlowLayout());
            dlg.setBounds(900, 500, 300, 160);
            dlg.add(lbl);
            dlg.add(butOK);
            dlg.setVisible(true);
            dlg.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e){
                    dlg.setVisible(false);
                }
            });
            butOK.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO 自動生成的方法存根
                    dlg.setVisible(false);
                }
            });
        } else
            fileList(f);
    }
    private void fileList(File f) {
        // TODO 自動生成的方法存根
        File[] files = f.listFiles();

        for (File file : files) {
            ta.append(file.toString());
            ta.append("\r\n");
        }
        /*
         * for (File file : files) { if (!file.isHidden()) { if
         * (file.isDirectory()) { ta.append(file.toString()); ta.append("\r\n");
         * fileList(file); } else { ta.append(file.toString());
         * ta.append("\r\n"); // System.out.println(f); } } }
         */
    }

    private void myEvent() {
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        new MyWindowDemo();
    }
}

這裡寫圖片描述

以上就是Java awt介面的api基本使用.