黑馬程序員java基礎之GUI

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

GUI即時圖形化界面圖形化界面方便較命令行模式更加簡單明瞭,易於操作。圖形化界面提供的隊形都在java.awt和javax.Swing中。Awt相對比較依賴於平臺。

1.創建圖形化界面的步驟:

1.創建Frame窗體

2.對窗體進行基本設置,比如大小,位置,佈局

3.定義組件

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

5.讓窗體顯示,通過SetVisible(true)

import java.awt.*;
class AwtDemo
{
	public static void main(String[] args)
	{
		Frame f=new Frame("my awt");//創建窗體
		//會默認邊界式佈局,並且全部居中填充
		f.setSize(500,400);//設置窗體的大小
		f.setLocation(300,200); //設置窗體的位置
		f.setLayout(new FlowLayout()); //設置佈局管理
		Button b=new Button("我是一個按鈕");//創建按鈕

		f.add(b);
		f.setVisible(true);

		System.out.println("Hello word");
	}
}

2.事件監聽機制

特點:事件源,事件,監聽器,事件處理,這些都已經在java中定義好了,直接獲取對象就可以了

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

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

監聽器:將可以觸發一個事件的動作都已經封裝到了監聽器中

import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
	public static void main(String[] args)
	{
		Frame f=new Frame("my awt");//創建窗體
		//會默認邊界式佈局,並且全部居中填充
		f.setSize(500,400);//設置窗體的大小
		f.setLocation(300,200); //設置窗體的位置
		f.setLayout(new FlowLayout()); //設置佈局管理
		Button b=new Button("我是一個按鈕");//創建按鈕

		f.add(b);

		f.addWindowListener(new WindowAdapter(){
				public void windowClosing(WindowEvent e)//複寫WindowListener的關閉方法
				{
					System.out.println("我被關了啦"+e.toString());
					System.exit(0);
				}
				public void windowActivated(WindowEvent e)
				{
					System.out.println("我活了");//被前置
				}
				public void windowOpened(WindowEvent e)
				{
					System.out.println("我被打開了");
				}
			}
		);  //創建一個匿名內部類,此類是WindowListener的子類

		f.setVisible(true);  //通過ture值,使frame窗口可見
	}
}
然後實現按鈕的關閉功能

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

class FrameDemo
{
	private Frame f;//聲明私有成員變量窗體
	private Button but;//聲明私有成員變量按鈕
	FrameDemo()//構造函數
	{
		init();
	}
	public void init()
	{
		f=new Frame();   //創建窗體對象
		//對窗體進行基本設置
		f.setBounds(300,100,600,500);//座標值和寬高
		f.setLayout(new FlowLayout());//單獨指定佈局管理器,避免整個填充
		
		but=new Button("my button");//創建按鈕

		f.add(but);//添加組件到窗體裏
		
		myEvent();  //加載窗體上的事件
		
		f.setVisible(true);//顯示窗體
	}
	public void myEvent()//將監聽器單獨封裝成方法
	{
		f.addWindowListener(new WindowAdapter()    //將監聽器添加到窗體中,並引用匿名內部類,實例化監聽器的各種方法
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);
				}
			});

		//讓按鈕具備退出功能

		but.addActionListener(new ActionListener()    
			//調用匿名內部類,複寫按鈕監聽器中的actionPerformed方法,執行退出操作
			{
				public void actionPerformed(ActionEvent e)
				{
					System.out.println("退出,按鈕執行");
					System.exit(0);
				}
			});
	}
	public static void main(String[] args)
	{
		new FrameDemo();
	}
	
}

鼠標和鍵盤事件:
import java.awt.*;
import java.awt.event.*;

class MouseAndKeyEvent
{
	private Frame f;	//聲明私有成員變量窗體
	private Button but;	//聲明私有成員變量按鈕
	private TextField tf;	//聲名變量文本框

	MouseAndKeyEvent()  	//構造函數
	{
		init();
	}
	public void init()
	{
		f=new Frame();   //創建窗體對象
		//對窗體進行基本設置
		f.setBounds(300,100,600,500);	//座標值和寬高
		f.setLayout(new FlowLayout());	//單獨指定佈局管理器,避免整個填充
		
		tf=new TextField(20);	//創建文本框,10是添加的列數

		but=new Button("my button");	//創建按鈕

		f.add(but);	//添加組件到窗體裏
		
		f.add(tf);	//添加文本框到窗體中

		myEvent();  	//加載窗體上的事件
		
		f.setVisible(true);	//顯示窗體
	}
	private void myEvent()		//將監聽器單獨封裝成方法
	{
		f.addWindowListener(new WindowAdapter()    //將監聽器添加到窗體中,並引用匿名內部類,實例化監聽器的各種方法
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);
				}
			});

		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();	//使用此事件,將會不再按照默認的方式處理。
							//在這裏,原本輸入除了數字之外的字符也都會進入文本框,
							//採用這個事件之後,除數字之外的字符不再進入文本框
				}	
			}
		});

		but.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					System.out.println("action ok");
				}
			});	//發現鼠標點擊會先於按鈕活動按鈕

		but.addMouseListener(new MouseAdapter()			//給button添加鼠標監聽   
 
			//調用匿名內部類,複寫按鈕監聽器中的mouseEntered方法,實現鼠標進入事件
			{
				private int count=1;	//定義一個計數器
				private int ck=1;
				public void mouseEntered(MouseEvent e)
				{
						
					System.out.println("鼠標進入到該組件"+count++);	
				}
				public void mouseClicked(MouseEvent e)
				{
					if(e.getClickCount()==2)	//鼠標雙擊動作
						System.out.println("雙擊動作"+ck++);
				}
			});

		but.addKeyListener(new KeyAdapter()	//給按鈕添加鍵盤監聽
			{
				public void keyPressed(KeyEvent e)
				{
					/*
					if(e.getKeyCode()==KeyEvent.VK_ENTER)	//如果按到enter鍵是退出
						System.exit(0);
					*/

					//組合鍵操作
					if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER)
						System.out.println("ctrl+enter 是運行了");
					//獲取鍵盤碼和對應的鍵名
					//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"--"+e.getKeyCode());	
				}
			});
	}
	public static void main(String[] args)
	{
		new MouseAndKeyEvent();
	}
}

練習:列出指定目錄內容

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo
{
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	private Dialog d;	//引用一個對話框成員變量
	private Label lab;	//引用一個標籤
	private Button okbu;	//引用按鈕變量,應用於對話框中
	MyWindowDemo()
	{
		init();
	}
	public void init()
	{
		f=new Frame("my window");	//創建一個窗體
		f.setBounds(300,100,600,400);	//設置窗體的位置,寬高
		
		f.setLayout(new FlowLayout());	//設置成流佈局

		tf=new TextField(30);	//新建文本框,設置列數是30
		
		but=new Button("轉到");	//新建按鈕
		ta=new TextArea(10,40);	//新建文本編輯區域,15行40列

		d=new Dialog(f,"提示信息-self",true);	//新建一個對話框,true值表示當前窗口不處理就無法處理後置窗口
		d.setBounds(400,200,200,150);		//設置對話框的位置和寬高
		d.setLayout(new FlowLayout());		//設置對話框佈局爲流式佈局

		lab=new Label();			//創建標籤
		okbu=new Button("確定");		//創建對話框中的按鈕

		d.add(lab);
		d.add(okbu);

		f.add(tf);
		f.add(but);
		f.add(ta);

		myEvent();	
		f.setVisible(true);	//設置窗口可視
	}
	private void myEvent()
	{
		okbu.addActionListener(new ActionListener()	//操作時調用
			{
				public void actionPerformed(ActionEvent e)
				{
					d.setVisible(false);	//點擊對話框的確認按鈕事件就會不顯示對話框了
				}
			});
		d.addWindowListener(new WindowAdapter()	//添加窗體關閉方法,複寫關閉方法
			{
				public void windowClosing(WindowEvent e)
				{
					d.setVisible(false);	//點擊對話框關閉按鈕的時候就不顯示對話框了
				}
			});
		tf.addKeyListener(new KeyAdapter()
		{
			public void keyPressed(KeyEvent e)
			{
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showDir();
			}
		});
					
		but.addActionListener(new ActionListener()	//添加窗體監聽器
			{
				public void actionPerformed(ActionEvent e)	//操作時調用
				{
					showDir();		//在操作時調用目錄轉入文本區功能函數
				}
			});
		f.addWindowListener(new WindowAdapter()		//添加窗體關閉方法,複寫關閉方法
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);		//退出窗體
				}
			});

	}

	private void showDir()	//輸入目錄後轉入文本區的功能封裝成一個方法
	{
		
		String dirPath=tf.getText();	//獲取文件目錄文本
					
		File dir=new File(dirPath);	//將目錄封裝成文件對象,只有封裝成文件對象,才能找到目錄下的文件列表
		if(dir.exists() && dir.isDirectory())	//確保目錄存在
		{
			ta.setText("");	//清空之前的目錄
			String[] names=dir.list();	//將文件列表存入數組中
			for(String name:names)
			{
				ta.append(name+"\r\n");	//遍歷數組,將目錄添加到文本區
			}
		}

		else		//如果目錄不存在的處理方式
		{
			String info="您輸入的路徑"+dirPath+"不存在";
			lab.setText(info);
			d.setVisible(true);	//如果目錄不存在,就顯示對話框
		}
						

		//tf.setText("");	//將搜素的內容轉到文本區域後,清空文本框
	}

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




菜單欄的製作,簡單的製作出菜單欄及一些菜單

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

class MyMenuDemo
{
	private Frame f;	//引用窗體變量
	private MenuBar mb;	//引用菜單條變量
	private Menu m;		//引用菜單變量
	private MenuItem closeItem,openItem,salveItem;	//引用菜單項

	MyMenuDemo()		//構造函數初始化
	{
		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("文件");		//初始化菜單

		closeItem=new MenuItem("退出");	//初始化菜單項目
		openItem=new MenuItem("打開");
		salveItem=new MenuItem("保存");
		
		mb.add(m);		//將菜單添加到菜單欄中

		m.add(openItem);
		m.add(salveItem);
		m.add(closeItem);		//將關閉按鈕添加到菜單中


		f.setMenuBar(mb);	//將菜單欄設置到窗體中

		myEvent();
		
		f.setVisible(true);
	}

	private void myEvent()
	{
		closeItem.addActionListener(new ActionListener() //關閉項目處理機制
			{
				public void actionPerformed(ActionEvent e)
				{	
					System.exit(0);
				}
			});
		f.addWindowListener(new WindowAdapter()		//添加窗體關閉方法,複寫關閉方法
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);		//退出窗體
				}
			});
	}
	public static void main(String[] args)
	{
		new MyMenuDemo();
	} 
}

然後具體實例化菜單中的打開和保存操作

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuTest
{
	private Frame f;	//引用窗體變量
	private MenuBar bar;	//引用菜單條變量

	private TextArea ta;
	private Menu fileMenu;		//引用菜單變量
	private MenuItem closeItem,openItem,saveItem;	//引用菜單項

	private FileDialog openDia,saveDia;		//引用打開和保存對話框

	private File file;		//引用文件變量
	MyMenuTest()		//構造函數初始化
	{
		init();
	}
	public void init()
	{
		f=new Frame("my window");	//初始化窗口
		f.setBounds(300,100,500,600);	//設置窗口的位置和寬高
		// f.setLayout(new FlowLayout());	//設置窗體的佈局方式爲流式佈局

		bar=new MenuBar();		//初始化菜單欄

		ta=new TextArea();

		fileMenu=new Menu("文件");		//初始化菜單

		closeItem=new MenuItem("退出");	//初始化菜單項目
		openItem=new MenuItem("打開");
		saveItem=new MenuItem("保存");
		
		bar.add(fileMenu);		//將菜單添加到菜單欄中

		fileMenu.add(openItem);
		fileMenu.add(saveItem);
		fileMenu.add(closeItem);		//將關閉按鈕添加到菜單中


		f.setMenuBar(bar);	//將菜單欄設置到窗體中
		
		openDia=new FileDialog(f,"打開了",FileDialog.LOAD);	//初始化
		saveDia=new FileDialog(f,"開始保存",FileDialog.SAVE);
		myEvent();
		f.add(ta);
		f.setVisible(true);
	}

	private void myEvent()
	{
		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);	//封裝成對象

					}
					try
					{
						BufferedWriter bufw=new BufferedWriter(new FileWriter(file));	//創建文件寫入流緩衝區,將文件傳入流中
						String text=ta.getText();	//獲取文本區內容
						bufw.write(text);		//將文本框內容寫出去
						bufw.close();		//關閉流
					}
					catch(IOException ioe)
					{
						throw new RuntimeException("寫入失敗");
					}
				}
			});
		openItem.addActionListener(new ActionListener()		//創建打開事件監聽機制
			{
				public void actionPerformed(ActionEvent e)
				{	
					openDia.setVisible(true);	//顯示對話框
					String dirPath=openDia.getDirectory();	//獲取文件路徑
					String fileName=openDia.getFile();	//獲取文件名
					System.out.println(dirPath+"--"+fileName);

					if(dirPath==null || fileName==null)	//判斷是否爲空
						return;
					ta.setText("");		//打開新文件之前,清空之前的內容
					file=new File(dirPath,fileName);	//將文件路徑和文件名封裝成對象
					
					try
					{
						BufferedReader bufr=new BufferedReader(new FileReader(file));	
						//創建讀取流緩衝區,將file文件傳入
						String line=null;
						while((line=bufr.readLine())!=null)	//開始讀取數據
						{
							ta.append(line+"\r\n");		//添加到文本區中
						}
						bufr.close();
					}
					catch(IOException ioe)
					{
						throw new RuntimeException("讀取失敗");
					}
				}
			});
		closeItem.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{	
					System.exit(0);
				}
			});
		f.addWindowListener(new WindowAdapter()		//添加窗體關閉方法,複寫關閉方法
			{
				public void windowClosing(WindowEvent e)
				{
					System.exit(0);		//退出窗體
				}
			});
	}
	public static void main(String[] args)
	{
		new MyMenuTest();
	} 
}
將打開的文件傳到文本區中 在文本區寫些數據,保存到桌面
          

練習:上述文件保存管理操作前提還是在DOS命令行下操作。接下來創建只用雙擊就可以執行的jar包

先在代碼段中用包將其封裝,javac  -d  .java  將相關的類都打包,裝到一個文件夾中。然後返回包所在的目錄,執行以下命令






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