Java基礎<十三>_GUI

GUI

一、GUI

    1.1、概述

    GUI:Graphical User Interface(圖形用戶接口),用圖形的方式與用戶進行交互,使得操作更加簡單易懂,計算機的推廣很大的功勞來源於GUI。

    CLI:CommandLine User Interface(命令行用戶接口),即Dos命令行操作,需要記住常用指令,早期的計算機就是這種形式,操作不直觀,windows系統中,基本被GUI替代,但在Linux系統中仍然有相當重要的地位。

    在java中,操作GUI的組件以及方法等等都封裝在awt和swing兩個工具包中。

    java.awt:Abstract Window Toolkit(抽象窗口工具包),重量級控件;需要調用本地系統方法實現功能。

    Javax.Swing:是在awt的基礎上,建立的一套圖形化界面系統,輕量級控件;其中提供了更多的組件,而且完全由java實現,不依賴本地系統。

    awt中常用組件的關係如下圖所示:


    注意:Container:即容器,是一個特殊的組件,該組件中可以通過add方法添加其他的組件

    佈局管理器:即容器中各組件的排放方式。

    常見的佈局管理器:

        FlawLayout(流式佈局管理器):從左到右的順序排列,Panel默認;

        BorderLayout(邊界佈局管理器):東、南、西、北、中,Frame默認;

        GridLayout(網格佈局管理器):規矩的矩形;

        CardLayout(卡片佈局管理器):選項卡;

        GridBagLayout(網格包佈局管理器):非規則的矩形。

    創建圖形化界面的步驟:

    1、創建frame窗體;

    2、對窗體進行基本設置;比如:大小、位置、佈局等等;

    3、定義組件;

    4、將組件通過窗體的add方法添加到窗體中;

    5、讓窗體顯示,通過setVisible(true)完成。

    1.2、事件監聽機制

    事件監聽機制由事件源、事件、監聽器、事件處理四個部分組成。

    事件源:就是awt或者swing包中的那些圖形界面組件;

    事件:每一個事件源都有自己特有的對應事件和共性事件;

    監聽器:用於封裝可以觸發某一事件的動作;

    事件處理:以上三者,在java中都已經定義好了,直接獲取其對象即可;我們需要做的,就是事件處理

    事件監聽機制如下圖所示:


    事件監聽機制的實現:1、確定事件源(容器或者組件);2、通過事件源對象的addXxxListener()方法將監聽器註冊到該事件源上;3、該方法接收的是XxxListener的子類對象,或者XxxAdapter的子類對象,一般用匿名內部類表示;4、覆蓋特定事件的方法。

    注意:XxxAdapter是Xxxlistener的子類,複寫了所有的抽象方法,但由於創建對象無意義,所以XxxAdapter定義爲抽象類 。因爲WindowListener的子類windowAdapter已經實現了windowListener接口,並覆蓋了其中的所有方法,那麼我們只要繼承自windowadapter,並覆蓋我們需要的方法即可。總之,適配器繼承於監聽器,並覆蓋了相應的方法,使用適配器不必覆蓋多餘的方法

常用的監聽器有:窗體監聽器WindowListener,活動監聽器ActionListener,鼠標監聽器MouseListener,鍵盤監聽器KeyListener。當監聽器有三個及三個以上的方法時,一般都有相匹配的適配器!

    菜單

    菜單:MenuBar、Menu、MenuItem;先創建菜單條,再創建菜單,每一個菜單中建立菜單項;也可以菜單添加到菜單中,作爲子菜單;通過setMenuBar()方法,將菜單添加到Frame中。

    菜單的繼承關係如下圖所示:


1、基本的演示:

package itheima.day22;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
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.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameDemo {
	
	/*1、定義該圖形中所需的組件引用*/
	private Frame f;
	private Button but;
	private TextField tf;//文本區域
	
	FrameDemo(){
		init();
	}
	
	public void init(){
		f = new Frame("這是一個框架");
		//對frame進行基本設置
		f.setBounds(200, 300, 400, 500);//設置,位置,大小
		f.setLayout(new FlowLayout());//設置流式佈局,默認是邊界佈局
		
		but = new Button("一個按鈕");
		tf = new TextField(20);//指定列數
		
		//將組件添加到frame中
		f.add(but);
		f.add(tf);
		
		//加載一下窗體上事件
		myEvent();
		
		//顯示窗體
		f.setVisible(true);
	}
	
	private void myEvent(){
		//給窗體增加監聽的功能,
		f.addWindowListener(
				new WindowAdapter(){
					@Override
					public void windowClosing(WindowEvent e) {//關閉窗口
						System.exit(0);
					}
				});
		//按鈕的活動監聽
		but.addActionListener(new ActionListener(){//活動監聽器
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("action ok");	
			//	System.out.println("按鈕退出程序");
			//	System.exit(0);
			}
		});
		//監聽鼠標事件
		but.addMouseListener(new MouseAdapter(){//鼠標監聽器
			int enter;
			int clicked;
			@Override
			public void mouseClicked(MouseEvent e) {
				if(e.getClickCount()==2)
					System.out.println("雙擊按鈕:"+clicked++);
			//	System.out.println("點擊按鈕:"+clicked++);
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				System.out.println("鼠標進入按鈕::"+enter++);
			}	
		});
		
		tf.addKeyListener(new KeyAdapter(){//鍵盤監聽器
			@Override
			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  FrameDemo();
	}
}

2、演示在窗體中顯示文件列表

package itheima.day22;

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 f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	
	private Dialog d;//窗體
	private Label lab;
	private Button okBut;
	
	MyWindowDemo(){
		init();
	}
	
	public void init(){
		f = new Frame("我的窗體");//創建窗體
		f.setBounds(300,100,600,500);//設置位置,大小
		f.setLayout(new FlowLayout());//設置流式佈局
		
		tf = new TextField(70);//文本行
		but = new Button("轉到");//按鈕
		ta = new TextArea(25,70);//文本區域
		
		d = new Dialog(f,"提示信息--self",true);//對話框,模式爲true,模態形式
		d.setBounds(400,200,400,250);
		d.setLayout(new FlowLayout());
		
		lab = new Label();//標籤
		okBut = new Button("確定");
		
		d.add(okBut);//對話框中添加一個按鈕
		d.add(lab);//對話框中添加一個標籤
		
		f.add(tf);//給窗體添加組件
		f.add(but);
		f.add(ta);
		
		myEvent();//事件監聽
		
		f.setVisible(true);//可視化
	}
	
	private void myEvent(){
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {//窗體的關閉功能
				System.exit(0);
			}
		});
		
		d.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {//對話框的關閉功能
				d.setVisible(false);
			}	
		});
		
		tf.addKeyListener(new KeyAdapter(){
			@Override
			public void keyPressed(KeyEvent e) {//文本行的接收鍵盤輸入的功能
				if(e.getKeyCode() == KeyEvent.VK_ENTER)//回車
					showDir();
			}
		});
		
		okBut.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {//對話框中確定按鈕的活動監聽
				d.setVisible(false);
			}
		});
		
		but.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {//窗體中轉到按鈕的活動監聽
				showDir();
			}		
		});	
	} 
	
	private void showDir(){//顯示目錄
		
		String dirPath = tf.getText();//獲取文本行裏面的內容
		
		File dir = new File(dirPath);//封裝成爲一個File對象,方便操作
		
		if(dir.exists() && dir.isDirectory()){//存在並且是一個文件夾
			String[] names = dir.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();
	}
}

3、演示打開保存文件的功能

package itheima.day22;

import java.awt.FileDialog;
import java.awt.FlowLayout;
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.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class MyMenuDemo {

	private Frame f;//窗體
	private MenuBar bar;//菜單欄
	private Menu fileMenu,subMenu;//菜單
	private MenuItem closeItem,subItem;//菜單條
	
	private MenuItem openItem,saveItem;//打開、保存、菜單條
	
	private FileDialog openDia,saveDia;//文件對話框
	
	private TextArea ta;//文本區域,用於顯示打開文件的內容
	
	private File file;//文件
	
	MyMenuDemo(){
		init();
	}
	
	public void init(){
		//窗體
		f = new Frame("my window");
		f.setBounds(300,100,500,600);
		f.setLayout(new FlowLayout());
		
		bar = new MenuBar();//菜單欄
		fileMenu = new Menu("文件");
	//	subMenu = new Menu("子菜單");
		
		subItem = new MenuItem("子條目");
		closeItem = new MenuItem("退出");
		
		openItem =  new MenuItem("打開");
		saveItem = new MenuItem("保存");
		
		ta = new TextArea(30,60);
		
	//	subMenu.add(subItem);
	//	m.add(subMenu);
		fileMenu.add(openItem);//菜單中加入打開菜單
		fileMenu.add(saveItem);//保存
		fileMenu.add(closeItem);//關閉
		bar.add(fileMenu);//在菜單欄中添加菜單
		
		f.setMenuBar(bar);//窗體中增加菜單欄
		f.add(ta);//窗體中加入文本區域
		
		openDia = new FileDialog(f,"打開",FileDialog.LOAD);//打開對話框
		saveDia = new FileDialog(f,"保存",FileDialog.SAVE);//保存對話框
		
		myEvent();//事件
		f.setVisible(true);//窗體的可視化
	}
	
	private void myEvent(){
		f.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {//窗體關閉功能
				System.exit(0);
			}
		});
		closeItem.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {//關閉菜單項的關閉功能
				System.exit(0);	
			}
		});
		
		openItem.addActionListener(new ActionListener(){//打開菜單項的活動監聽
			@Override
			public void actionPerformed(ActionEvent e) {
				openDia.setVisible(true);//顯示打開對話框
				
				String dirPath = openDia.getDirectory();
				String fileName = openDia.getFile();
				
				if(dirPath ==null || fileName == null)
					return ;
				ta.setText("");//清空文本區域
				
				file = new File(dirPath,fileName);//將路徑和文件名封裝成爲對象
				try {
					BufferedReader bufr = new BufferedReader(new FileReader(file));//讀取文件中的數據
					String line = null;
					while((line = bufr.readLine())!= null)
					{
						ta.append(line +"\r\n");//追加到文本區域中
					}
					bufr.close();
				} catch (IOException e1) {
					throw new RuntimeException("文件讀寫異常");
				}
			}
		});
		saveItem.addActionListener(new ActionListener(){//保存菜單項的活動監聽
			@Override
			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);//封裝成FIle對象,方便操作
				}
				try {
					BufferedWriter bufw = new BufferedWriter(new FileWriter(file));//寫入流
					/*寫入到指定的文件中*/
					String text = ta.getText();
					bufw.write(text);
					bufw.flush();
					bufw.close();
				} catch (IOException e1) {
					throw new RuntimeException("文件讀寫異常");
				}
			}
		});
	}
	public static void main(String[] args) {
		new MyMenuDemo();	
	}
}


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