---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------
一、概述
1、GUI:GraphicalUser Interface,即圖形用戶界面,用於計算機與用戶交互的一種方式。
2、計算機與用戶交互的兩種方式:GUI和CLI
GUI: Graphical User Interface,圖形用戶接口,用圖形方式,來顯示計算機操作界面,方便直觀。
CLI: Command LineUser Interface,命令行用戶接口,即常見的Dos命令行操作,須記住一些命令,操作不直觀。
3、java也將這種界面封裝爲對象,其中的對象都放在了兩個包中:java.Awt包和javax.Swing包。
java.Awt包:Abstract Window Toolkit,即抽象窗口工具包。要調用本地系統方法實現功能,屬重量級控件。
javax.Swing包:在AWT的基礎上建立的一套圖形界面系統,其中提供了更多的組件,且完全由java實現,增強了移植性,屬輕量級控件。
二、繼承關係圖
Container:爲容器,是一個特殊的組件,該組件中可以通過add方法添加其他組件進來。
Container常用子類:Window Panel(面板,不能單獨存在。)
Window常用子類:Frame Dialog
三、佈局管理器
1、佈局:容器中的組件排列方式
2、常見的佈局管理器:
1)FlowLayout:流式佈局管理器。從左向右排列,是Panel默認的佈局管理器
2)BorderLayout:邊界式佈局管理器,東南西北中的排列方式,是Frame的默認佈局管理器。如果窗體中只有一個組件,將會覆蓋整個窗體。
3)GridLayout:網格式佈局管理器,規則的矩陣
4)CardLayout:卡片式佈局管理器,即選項卡
5)GridBayLayout:網格包佈局管理器,非規則矩陣
3、如果存在多種佈局方式,如何創建窗體界面呢?步驟:
1)先將窗體Frame進行大區域的劃分,設置其佈局管理器,加入面板Panel
2)將組件加入Panel,設置面板的佈局管理器。
四、簡單的窗體創建過程
1、創建Frame窗體:
Frame f = new Frame("my Frame");//可設置標題,即窗體名字
2、對窗體進行基本設置:如大小,位置,佈局等:
f.setSize(int wight,int hight);//窗體大小設置
f.setLocation(int x,int y);//窗體顯示位置設置,橫縱座標
f.setBounds(int x,int y,int wight,int hight),也可以直接用這個方法對大小和位置設置
f.setLayout(Layout layout),參數爲指定的佈局管理器,如FlowLayout
3、定義組件:
如Button b = new Button(“my Button”);//可設置組件的名稱
4、將組件通過窗體的add方法添加到窗體中:
f.add(b);//將按鈕組件添加進窗體
5、讓窗體顯示:
f.setVisible(boolean b);//通過設置參數是true還是false是否顯示窗體
示例:
五、事件監聽機制
1、組成:
1)事件源(組件):awt或swing包中的那些圖形界面組件
2)事件(Event):每一個事件源都有自己特有的對應事件和共性事件
3)監聽器(Listener):將可觸發某一事件的動作(不只一個動作),都封裝到偵聽器中。
4)事件處理:引發事件後的處理方式。
2、使用說明
組成的前三個在java中都已將定義好了,直接獲取其對象來用即可,我們需要做的就是對產生的動作進行處理。
步驟:
1)確定事件源(容器或組件)。通過事件源對象的addXXXListener()方法將監聽器註冊到該事件源上。該方法中接收XXXListener的子類對象,或者XXXListener的子類XXXAdapter的子類對象。
2)一般用匿名內部類來表示。在覆蓋方法的時候,方法的參數一般是XXXEvent類型的變量接收。
如:
說明:
1)事件觸發後會把事件打包成對象傳遞給複寫方法中參數的變量。(其中包括事件源對象。通過getSource()或者,getComponent()獲取。)
2)若用子類實現WindowListener接口,就需要覆蓋其中的7個方法,可只用到其中的關閉動作,其他動作未用到,但卻必須重寫全部。因爲WindowLister的子類WindowAdapter(適配器)已經實現此接口,並覆蓋了其中所有方法。那麼只需繼承WindowAdapter,覆蓋需要的方法即可。
3)明確事件,並對事件進行處理,其實,添加什麼監聽器就需要添加什麼事件。
示例:
練習:
應用
一、對話框:Dialog
何時需要產生對話框:此對象時需要在調用時,才創建對象。如:當在誤操作的時候,就需要出現提示錯誤信息的對話框,此時才創建的這個對象。
示例:
對列出指定目錄內容示例的功能增強。
二、菜單:Menu
1、菜單繼承關係
2、說明
1)Menu:菜單,繼承MenuItem;有右三角的圖標存在,可添加Menu和MenuItem
2)MenuBar:菜單欄,可添加菜單和菜單條目。一般先創建菜單欄,再創建菜單。
3)MenuItem:菜單條目,也稱菜單項,無右三角的圖標存在,是最終的菜單項。
4)菜單的事件處理和組件一樣,可以對類型爲MenuItem和Menu的對象這個事件源添加活動監聽ActionListener,並進行相關的事件處理。
5)通過setMenuBar()方法,將菜單添加到Frame中。
示例:
- import java.awt.*;
- import java.awt.event.*;
- class MyMenuDemo
- {
- //定義組件引用
- private Frame f;
- private MenuBar mb;
- private Menu m,subMenu;
- private MenuItem closeItem,subItem;
- //構造函數
- 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("文件");//創建菜單
- subMenu = new Menu("子菜單");//菜單下面的子菜單
- subItem = new MenuItem("子條目");//子菜單包含的菜單條目
- closeItem = new MenuItem("退出");//菜單包含的條目
- //菜單添加菜單組件
- subMenu.add(subItem);
- m.add(subMenu);
- m.add(closeItem);
- mb.add(m);
- //窗體添加菜單組件
- 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.*;
class MyMenuDemo
{
//定義組件引用
private Frame f;
private MenuBar mb;
private Menu m,subMenu;
private MenuItem closeItem,subItem;
//構造函數
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("文件");//創建菜單
subMenu = new Menu("子菜單");//菜單下面的子菜單
subItem = new MenuItem("子條目");//子菜單包含的菜單條目
closeItem = new MenuItem("退出");//菜單包含的條目
//菜單添加菜單組件
subMenu.add(subItem);
m.add(subMenu);
m.add(closeItem);
mb.add(m);
//窗體添加菜單組件
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();
}
}
三、jar包雙擊執行
既然是圖形化界面,就需要通過圖形化界面的形式運行程序,而不是是用Dos命令行執行,那麼如何通過雙擊程序就執行程序呢?這就需要將程序的class文件打包。
步驟如下:
1、首先要在java文件中導入一個包,沒有則需創建一個包,如package mymenu;
2、生成包:通過編譯javac -d c:\myclass MyMenu.java,此時則在c盤下的myclass文件夾下生成了所有的.class文件
3、在此目錄下新建一個文件,如1.txt或者其他任意名稱任意擴展名的文件都可,然後在其中編輯固定的格式:“Main-Class: mymenu.MenuDemo”,只寫引號中的內容。需要需要在冒號後有一個空格,在文件末尾要回車。
4、編譯:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,則直接編譯jar即可得出相應的命令
5、此時雙擊即可執行。
說明:
1)在固定格式中:
a、如果無空格:在編譯的時候,就會報IO異常,提示無效的頭字段,即invalidheader field。這說明1.txt在被IO流讀取。
b、如果無回車:在列表清單.MF中不會加入相應的加載主類的信息,也就是說配置清單的屬性主類名稱不會加載進清單中,也就不會執行。
2)jar文件必須在系統中註冊,才能運行。註冊方法如下:
A.對於XP系統:
a.打開任意對話框,在菜單欄點擊工具按鈕,選擇文件夾選項
b.選擇新建--->擴展名,將擴展名設置爲jar,確定
c.選擇高級,可更改圖標,然後點擊新建,命名爲open,
d.在用於可執行應用程序中,點瀏覽,將jdk下的bin的整個文件路徑添加進來,並在路徑後添加-jar即可。
B.對於win7系統:
a.改變打開方式:右擊.jar文件,點擊打開方式,選擇默認程序爲jdk下bin中的javaw.exe應用程序。
b.修改關聯程序的註冊表:打開註冊表(win+r),找到註冊表路徑\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command下的字符串值,右擊點修改,在原路徑的中添加-jar,如:"C:\ProgramFiles\Java\jre6\bin\javaw.exe" -jar "%1",注意-jar兩邊要有空格,保存。
c.雙擊即可執行jar程序,如果仍不能執行,則需下載最新版的jdk。
示例:
/*
練習:利用Menu組件完成一個簡單的記事本程序。
需求:具有文件菜單,文件中有打開,保存和退出功能。將寫好的程序變爲雙擊可執行的程序。
*/
package mymenu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuText
{
//定義組件引用
private Frame f;
private TextArea ta;
private MenuBar mb;
private Menu fileMe;
private MenuItem openMi,saveMi,otherSaveMi,closeMi;
private FileDialog openDia,saveDia;
private File file;
//構造函數
MyMenuText()
{
init();
}
//功能實現
private void init()
{
//組件實例化
f=new Frame("MyText");
ta=new TextArea();
mb=new MenuBar();
fileMe=new Menu("文件");
openMi=new MenuItem("打開");
saveMi=new MenuItem("保存");
otherSaveMi=new MenuItem("另存爲");
closeMi=new MenuItem("退出");
openDia=new FileDialog(f,"選擇打開的文件",FileDialog.LOAD);
saveDia=new FileDialog(f,"保存到哪裏",FileDialog.SAVE);
//基本設置
f.setBounds(300,150,600,500);
//添加組件
f.add(ta);
f.setMenuBar(mb);
mb.add(fileMe);
fileMe.add(openMi);
fileMe.add(saveMi);
fileMe.add(otherSaveMi);
fileMe.add(closeMi);
//窗體中事件
myEvent();
//窗體顯示
f.setVisible(true);
}
private void myEvent()
{
//窗體關閉功能
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//打開事件
openMi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//顯示文件對話窗口
openDia.setVisible(true);//------------------
String dir=openDia.getDirectory();//獲取目錄
String fileName=openDia.getFile();//獲取文件名
if(dir==null||fileName==null)//對打開了文件對話框,但未做出操作的處理
return;
file=new File(dir,fileName);//文件對象
try
{
ta.setText("");//每打開一個文件時,將文本區的內容清空
//帶緩衝技術的讀取流
BufferedReader br=new BufferedReader(new FileReader(file));
String line=null;//讀一行
while ((line=br.readLine())!=null)
{
//添加到文本區域
ta.append(line+"\r\n");
}
br.close();//關流
}
catch (IOException ie)
{
throw new RuntimeException("文件打開失敗");
}
}
});
//保存事件
saveMi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//如果是第一次保存,則顯示文件對話框
if(file==null)//-------------
{
//顯示文件對話框
saveDia.setVisible(true);//----------------------
String dir=saveDia.getDirectory();
String filename=saveDia.getFile();
if(dir==null||filename==null)//--------------------
return;
file=new File(dir,filename);
}
save();//保存文件方法
}
});
//另存爲事件
otherSaveMi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//不管是不是第一次保存,都顯示文件對話框
saveDia.setVisible(true);//----------------------
String dir=saveDia.getDirectory();
String filename=saveDia.getFile();
if(dir==null||filename==null)//--------------------
return;
file=new File(dir,filename);
save();//保存文件方法
//保存時,默認文件對話框位置在打開文件的位置
openDia.setFile(file.getName());
}
});
//退出事件
closeMi.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
}
//保存文件
private void save()
{
try
{
//帶緩衝區的寫入流
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
//獲取文本區域中的內容
String text=ta.getText();
bw.write(text);//寫入文件中
bw.close();//關流
}
catch (IOException ie)
{
throw new RuntimeException("文件保存失敗");
}
}
public static void main(String[] args)
{
//程序運行
new MyMenuText();
}
}