黑馬程序員- GUI圖形用戶界面

------- android培訓java培訓、期待與您交流! ----------

 1,簡介

       GUI

          Graphical User Interface(圖形用戶接口).

          用圖形的方式,來顯示計算機操作的界面,這樣更方便更直觀

     CLI

         Command line User Interface(命令行接口)

        就是常見的Dos命令行操作

       需要記憶一些常用的命令,操作不直觀

   java 爲GUI提供的對象都在java.Awt和javax.Swing兩個包中。

  Awt和Swing

      java.Awt:Absttact Window ToolKit(抽象窗口工具包),需要調用本地系統方法實現功能。屬於重量級控件。對系統依賴性較強

      javax.Swing:在Awt的基礎上,建立一套 圖形界面系統,其中提供了更多的組件,而且完全有java實現。增強了可移植性,屬於輕量級別控件

繼承關係圖

 

Container:爲容器,是一個特殊的組件,該組件可以通過add方法添加其他組件進來

 

  佈局管理器

          容器中的組件的排放方式,就是佈局

        常見的佈局管理器

             FlowLayout(流式佈局管理器)

                從左到右的順序排列

                Panel默認的佈局管理器

           BorderLayout(邊界佈局管理器)

              東,南,西,北中

              Frame默認的佈局管理器

          GridLayout(網格佈局管理器)

            規則的矩陣

          GardLayout(卡片佈局管理器)   

               非規則的矩陣 

2,Frame

                 Frame基本界面步驟。代碼如下:

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;

/*
 * 創建圖形化界面
 * 1,對窗體進行基本設置
 * 2,對窗體進行基本設置
 *      比如大小,位置,佈局
 * 3,定義組件
 * 4,將組件通過窗體的add方法添加到窗體中。
 * 5,讓窗體顯示,通過setVisible(true)完成
 */
public class Test1 {
	public static void main(String[] args) {
		Frame f = new Frame("my awt");// 初始化不可見的,默認佈局管理器,邊界是佈局,如果沒有指定東南西北,就全部填充
		f.setSize(500, 100);// 設置橫縱座標
		f.setLocation(300, 200);// 距離左上角的左邊的位置,上邊的位置
		f.setLayout(new FlowLayout());
		Button b = new Button("按鈕");
		f.add(b);
		f.setVisible(true);// 設置可見的

		// System.out.println("Hello world");
	}

}

3,事件監聽機制

      事件源(組件)

      事件(Event)

      監聽器 (Lisener)

      事件處理(引發事件處理方式)

  

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

/*
 * 事件監聽機制的特點:
 * 1,事件源
 * 2,事件
 * 3,監聽器
 * 4,事件處理
 * 事件源:就是awt包中或者swing包中的那些圖形界面組件
 * 事件:每一個事件源都有自己特有的對應事件和共性事件
 * 監聽器:將可以觸發某一個事件的動作都已經封裝了監聽器中。
 * 以上三者:在java中都已經定義好了。
 * 直接獲取其對象來用就可以了。
 * 我們要做的事情是,就是對產生的動作進行處理。
 */
public class Test2 {
	public static void main(String[] args) {
		Frame f = new Frame("my awt");// 初始化不可見的,默認佈局管理器,邊界是佈局,如果沒有指定東南西北,就全部填充
		f.setSize(500, 100);// 設置橫縱座標
		f.setLocation(300, 200);// 距離左上角的左邊的位置,上邊的位置
		f.setLayout(new FlowLayout());
		Button b = new Button("按鈕");
		f.add(b);
		f.setVisible(true);// 設置可見的
		f.addWindowListener(new MyWin());// 添加監聽器,監聽器裏面定義的都是動作
		// 匿名內部類的方法如下
		/*
		 * f.addWindowListener(new WindowAdapter(){ public void
		 * windowClosing(WindowEvent e){ System.out.println("關閉");
		 * System.exit(0); }
		 * 
		 * });
		 */
		// System.out.println("Hello world");
		// WindowAdapter 實現了WindowListener接口
	}

}

/*
 * //覆蓋了7個方法。可是我只用到了關閉動作 //其他動作卻必須重寫 class MyWin implements WindowListener{
 * 
 * @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * }
 * 
 * @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * }
 * 
 * @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * }
 * 
 * @Override public void windowDeactivated(WindowEvent e) { // TODO
 * Auto-generated method stub
 * 
 * }
 * 
 * @Override public void windowDeiconified(WindowEvent e) { // TODO
 * Auto-generated method stub
 * 
 * }
 * 
 * @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * }
 * 
 * @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated
 * method stub
 * 
 * } }
 */
// 因爲WindowListener子類已經實現了WindwoListerer接口
// 並覆蓋了其中所有的方法,那麼我只要繼承自Windowadapter覆蓋我需要的方法即可
class MyWin extends WindowAdapter {
	public void windowClosing(WindowEvent e) {
		System.out.println("關閉");
		System.exit(0);
	}
}


4 Action事件

 組件活動時觸發   代碼如下:

import java.awt.*;
import java.awt.event.*;

public class Test3 {
	// 初始化
	Frame f = null;
	Button but = null;

	public Test3() {
		init();
	}

	public void init() {
		f = new Frame("my Frame");
		f.setBounds(300, 100, 600, 500);// 相當於setsize();setlocation();座標和寬度高度

		f.setLayout(new FlowLayout());
		but = new Button("my button");
		// 價值窗體事件
		myEvent();
		f.add(but);
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		// 讓按鈕具備退出程序功能
		/*
		 * 按鈕就是事件源 那麼選擇那個監聽器呢? 通過關閉窗體瞭解到,想要知道那個組件具備什麼樣的特有監聽器 需要查看該組件對象的功能
		 * (具體的組件支持哪些監聽,只有組件自己知道,添加監聽的方法肯定定義在組件自己內部)
		 */
		but.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {// 添加活動監聽,所以參數是活動事件
				// TODO Auto-generated method stub
				System.out.println("退出按鈕做的事");
				System.exit(0);
			}

		});// 由於接口方法只有一個,所以不需要適配器,方法超過三個的幾乎有適配器
	}

	public static void main(String[] args) {
		new Test3();
	}
}


5 鼠標事件

  在任何組件上都可以發生鼠標事件,入:鼠標進入組件,退出組件,在組件上方單機鼠標,

  拖動鼠標都發生鼠標事件,也就是說,組件可以成爲發生鼠標事件的事件源

  事件類型是MouseEvent,即當發生鼠標事件時,MouseEvent類自動創建一個事件對象。

 MouseEvent類中有幾個重要的方法。

1,getX();事件源的x座標

2,getY();事件源的y座標

3,getModifiers()獲取鼠標的左鍵或右鍵。鼠標的左鍵和右鍵分別使用InputEvent類中的常量BUTTONI_MASK和BUTTON3來表示

4,getClickCount()獲取鼠標被單機的次數

import java.awt.*;
import java.awt.event.*;

/*
 * 演示鼠標事件
 */
public class Test4 {
	// 初始化
	Frame f = null;
	Button but = null;

	public Test4() {
		init();
	}

	public void init() {
		f = new Frame("my Frame");
		f.setBounds(300, 100, 600, 500);

		f.setLayout(new FlowLayout());
		but = new Button("my button");
		// 價值窗體事件
		myEvent();
		f.add(but);
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		but.addMouseListener(new MouseAdapter() {
			private int count = 1;
			private int clickcount = 1;

			public void mouseEntered(MouseEvent e) {
				System.out.println("鼠標進入到該組件" + count++);
			}

			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2)
					System.out.println("雙擊動作!" + clickcount++);
			}
		});
	}

	public static void main(String[] args) {
		new Test4();
	}
}


6 鍵盤事件,文本框只能輸入數字,組合鍵

 在java事件模式中,必需有發生事件的事件源. 當一個組件處於激活狀態時.敲擊任何一個鍵,就會發生鍵盤事件.

具體的看代碼示例 如下:
    

import java.awt.*;
import java.awt.event.*;

/*
 * 演示鼠標事件
 */
public class Test5 {
	// 初始化
	Frame f = null;
	Button but = null;
	TextField tf = null;

	public Test5() {
		init();
	}

	public void init() {
		f = new Frame("my Frame");
		f.setBounds(300, 100, 600, 500);

		f.setLayout(new FlowLayout());
		tf = new TextField(20);// 指定列數初始化,要求只能輸入數字
		but = new Button("my button");
		// 價值窗體事件
		myEvent();
		f.add(tf);
		f.add(but);
		f.setVisible(true);
	}

	private void myEvent() {
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		// 給but添加一個鍵盤事件
		but.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {// 按下ctrl加上enter鍵組合鍵
					System.out.println("ctrl enter is run");
				}
				if (e.getKeyCode() == KeyEvent.VK_ENTER) {// 按下enter鍵退出
					System.exit(0);
				}
				System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + ".."
						+ e.getKeyCode());
			}
		});
		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 + "是非法的");
					e.consume();// 不準備用默認的方式處理事件,默認是輸入進去
				}
			}
		});
	}

	public static void main(String[] args) {
		new Test5();
	}
}


7 Dialog 列出指定目錄的內容,不存在的顯示 示例

    Dialog類和Frame類都是window的子類。對話框必須依賴於某個窗口或組件,當它所依賴的窗口或組件消失時,對話框也消失;當它所依賴的窗口或組件可見時,對話框會自動恢復。

主要方法

    Dialog(Frame f,String s):構造一個具有標題s的初始化不可見的對話框,所依賴的窗口。

    Dialog(Frame f,String s,boolean b):構造一個具有標題s的初始化不可見的對話框所依賴的窗口,b決定對話框是有模式或無模式。

   getTitle();獲取對話框標題

   setTitle();設置對話框的標題

   setModel(boolean b)設置對話框的模式

   setSize();設置對話框的大小

  setVisible(boolean b)

對話框的模式

  有模式對話框:對話框牌激活狀態,只讓程序響應對話框內部的事件,程序不能再激活它所依賴的窗口或組件,並堵塞其他線程的執行。

  無模式對話框處於非激活狀態,程序仍能激活它所依賴的窗口或組件,它也不堵塞線程的執行

 

import java.awt.*;
import java.awt.event.*;
import java.io.File;

/*
 * 列出指定目錄的內容
 */
public class Test6 {
	private Frame f;
	private TextField tf;
	private Button btn;
	private TextArea ta;
	private Dialog d;
	private Label lbl;
	private Button okbtn;

	public Test6() {
		init();
	}

	public void init() {
		f = new Frame("my window");
		f.setBounds(300, 100, 600, 600);
		f.setLayout(new FlowLayout());
		tf = new TextField(30);
		btn = new Button("轉到");
		ta = new TextArea(15, 40);

		d = new Dialog(f, "提示信息——自己的self", true);// true代表如果不操作對話框,模式操作不了
		d.setBounds(400, 200, 200, 100);
		d.setLayout(new FlowLayout());
		lbl = new Label();
		okbtn = new Button("確定");
		d.add(lbl);
		d.add(okbtn);
		f.add(tf);
		f.add(btn);
		f.add(ta);
		myEvent();
		f.setVisible(true);
	}

	public void myEvent() {
		tf.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ENTER) {
					show();
				}
			}
		});
		okbtn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				d.setVisible(false);
			}

		});
		d.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				d.setVisible(false);
			}
		});
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		btn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				show();
			}

		});
	}

	public static void main(String[] args) {
		new Test6();
	}

	private void show() {
		String path = tf.getText();
		File dir = new File(path);
		if (dir.isDirectory() && dir.exists()) {
			String[] names = dir.list();
			ta.setText("");
			for (String name : names) {
				ta.append(name + "\r\n");
			}
			tf.setText("");
		} else {
			String info = "您輸入的信息:" + path + "是錯誤的的";
			lbl.setText(info);
			d.setVisible(true);
		}
	}
}


  8,MenuBar,包含子菜單選項

菜單是窗口中常見的界面,是由

菜單項 (MenuBar)  菜單(Menu) 菜單項(MenuItem) 複選菜單項(CheckboxMenuItem)等對象組成

MenuBar  就是負責創建菜單條的,即MenuBar的一個實例就是一個菜單項。MenuBar bar=new MenuBar();

Frame類有一個將菜單條放置到窗口中的方法,其一般格式爲:setMenuBar(MenuBar menubar);,只能向窗口添加一個菜單條

Menu()建立一個空標題的菜單

Menu(String s)建立一個指定標題菜單,由參數s確定

若要創建菜單Menu,並添加到空菜單條對象bar中,可執行:Menu m1=nw Menu("file"); bar.add(m1);

MenuItem 類負責爲菜單創建菜單項,或爲每個菜單項創建其包含的更小的菜單子項MenuItem,並把菜單子項添加到菜單項中。

MenuItem open=new MenuItem("open");  m1.add(open);

import java.awt.*;
import java.awt.event.*;

public class Test7 {
	private Frame f;
	private MenuBar mb;
	private Menu m, subMenu;
	private MenuItem coloseItem, subItem;

	public Test7() {
		init();
	};

	public void init() {
		f = new Frame("my window");
		f.setBounds(300, 100, 500, 600);
		f.setLayout(new FlowLayout());
		mb = new MenuBar();
		m = new Menu("文件");
		subMenu = new Menu("子菜單 ");
		subItem = new MenuItem("子條目");
		coloseItem = new MenuItem("退出");
		subMenu.add(subItem);
		m.add(subMenu);
		m.add(coloseItem);
		mb.add(m);
		f.setMenuBar(mb);
		myEvent();
		f.setVisible(true);
	}

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

	public static void main(String[] args) {
		new Test7();
	}
}


9,FileDialog一個簡單的保存文件讀取文件的文本編輯器。

是Dialog的子類

    FileDialog(Dialog parent,String title, int mode)

zh_cn
創建一個具有指定標題的文件對話框窗口,用於加載或保存文件。

如果 mode 的值爲 LOAD,那麼文件對話框將查找要讀取的文件,所顯示的文件是當前目錄中的文件。如果mode 的值爲SAVE,則文件對話框將查找要寫入文件的位置。

parent
zh_cn
對話框的所有者
title
zh_cn
對話框的標題;接受 null 值時不會拋出 NullPointerException
mode
zh_cn
對話框的模式,FileDialog.LOADFileDialog.SAVE
 
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Test8 {
	private Frame f;
	private MenuBar mb;
	private Menu fileMenu;
	private MenuItem openItem, saveItem, closeItem;
	private FileDialog openDia, saveDia;
	private TextArea ta;
	private File file;

	public Test8() {
		init();
	}

	public void init() {
		f = new Frame("my window");
		f.setBounds(300, 100, 500, 600);
		mb = new MenuBar();
		fileMenu = new Menu("文件");
		openItem = new MenuItem("打開");
		saveItem = new MenuItem("保存");
		closeItem = new MenuItem("退出");
		ta = new TextArea();
		fileMenu.add(openItem);
		fileMenu.add(saveItem);
		fileMenu.add(closeItem);
		mb.add(fileMenu);
		f.setMenuBar(mb);
		f.add(ta);
		openDia = new FileDialog(f, "我要打開", FileDialog.LOAD);
		saveDia = new FileDialog(f, "我要保存", FileDialog.SAVE);
		myEvent();
		f.setVisible(true);

	}

	private void myEvent() {

		saveItem.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				if (file == null) {
					saveDia.setVisible(true);
					String path = saveDia.getDirectory();// 得到文件夾
					String name = saveDia.getFile(); // 得到文件名字
					if (path == null || name == null) {
						return;
					}
					file = new File(path, name);
				}
				try {
					BufferedWriter bufw = new BufferedWriter(new FileWriter(
							file));
					String text = ta.getText();
					bufw.write(text);
					bufw.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		openItem.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				openDia.setVisible(true);
				String path = openDia.getDirectory();// 得到文件夾
				String name = openDia.getFile(); // 得到文件名字
				// System.out.println(path+"..."+name);
				if (path == null || name == null) {
					return;
				}
				file = new File(path, name);
				ta.setText("");
				try {
					BufferedReader br = new BufferedReader(new FileReader(file));
					String text = ta.getText();
					String line = null;
					try {
						while ((line = br.readLine()) != null) {
							ta.append(line + "\r\n");
						}
						br.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

			}

		});

	}

	public static void main(String[] args) {
		new Test8();
	}
}











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章