-----------android培訓、java培訓、java學習型技術博客、期待與您交流!------------
概述
1、GUI:GraphicalUser Interface,即圖形用戶界面,用於計算機與用戶交互的一種方式。
2、計算機與用戶交互的兩種方式:GUI和CLI
GUI: Graphical User Interface,圖像化界面交互,圖形用戶接口,用圖形方式,來顯示計算機操作界面,方便直觀。
CLI: Command LineUser Interface,命令行用戶接口,即常見的Dos命令行操作,須記住一些命令,操作不直觀。
3、java.Awt包和javax.Swing包。
java.Awt包:Abstract Window Toolkit,即抽象窗口工具包。要調用本地系統方法實現功能,說明對平臺有一定的依賴性,跨平臺性較弱,屬重量級控件。
javax.Swing包:在AWT的基礎上建立的一套圖形界面系統,其中提供了更多的組件,且完全由java實現,增強了移植性,屬輕量級控件。
繼承關係圖
Button 按鈕 textcomponen 文本組件,包括文本框與文本區域
label 標籤 作用:用於封裝文字 checkbox 複選框
window 窗口 panel 面板
frame框架 dialog 對話框
filedialog 文件對話框 負責文件的選取和保存
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是否顯示窗體
演示用例:
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.ptintln("Hello World!");
}
}
事件監聽機制
用戶對組件的操作,就是一個事件,那麼產生事件的組件就是事件源。
接收並處理事件,與用戶進行交互的行爲就是事件處理器。這些處理方式都封裝在監聽器中
就如同開密碼鎖,爲了安全,密碼鎖上安裝了報警裝置,只要鎖被砸就會把鎖事件通知保安
那麼保安就有相應的處理方式
如果鎖沒有被砸,而是密碼輸入錯誤,那麼報警裝置也會將鎖事件通知保安,保安也會處理方式
那麼鎖就是事件源,報警裝置就是監聽器,可以用來監聽引發事件的動作。但必須要註冊到鎖上,否則鎖被砸保安就不知道
對於每一種動作都有不同的處理方式
1)事件源(組件):awt或swing包中的那些圖形界面組件
2)事件(Event):每一個事件源都有自己特有的對應事件和共性事件
3)監聽器(Listener):將可觸發某一事件的動作(不只一個動作),都封裝到偵聽器中。
4)事件處理:引發事件後的處理方式。
ddWindowListener(WindowLisener l)
添加指定的窗口偵聽器,以此窗口就收窗口事件
WindowLisener接口,用於接收窗口事件的偵測器窗口,常用方法如下:
windowActivated(WindowEvent e)
將Window設置爲活動Window時調用
windowClosed(WindowEvent e)
因對窗體調用dispose而將其關閉時調用
windowClosing(WindowEvent e)
用戶試圖從窗口的系統菜單中關閉窗口時調用
windowDeactivated(WindowEvent e)
當Window不再是活動Window時調用
windowDeiconified(WindowEvent e)
窗口從最小化狀態變成正常狀態時調用
windowIconified(WindowEvent e)
窗口從正常狀態變爲最小化狀態時調用
windowOpened(WindowEvent e)
窗口首次變爲可見時調用
java.awt.event包中的WindowAdapter實現了WindowLisener接口,並複寫了其中說有方法。接收窗口事件的抽象適配器類。此類中的方法爲空。複寫,但沒複寫內容此類存在的目的是方便創建偵聽器對象。
使用說明
組成的前三個在java中都已將定義好了,直接獲取其對象來用即可,我們需要做的就是對產生的動作進行處理。
步驟:
1、創建Frame窗體,一般在沒有設置佈局時,會默認使用邊界式佈局
rame f = new Frame("");
2、對窗體進行基本設置
比如大小、位置、佈局等
f.setSize(橫座標,縱座標);
3、定義組件
Button b = new Button("");
4、將組件通過窗體的add方法添加到窗體中
f.add(b);
5、讓窗體顯示,通過setVisible(true)來完成
f.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.addWindowListener(new MyWin())
f.addWindowListener(new WindowAdapter()){
public void windowClosing(WindowEvent e){
//System.out.println("關閉");
System.exit(0);
}
//窗體前置
public void windowActivated(WindowEvent e){
System.out.println("激活");
}
public void windowOpened(WindowEvent e){
System.out.println("打開");
}
});
f.setVisible(true);//
System.out.ptintln("Hello World!");
}
}
class MyWin extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
/*
需求:讓窗體的關閉功能實現
讓按鈕也具備退出程序的功能
*/
import java.awt.*;
import java.awt.event.*;
class FrameDemo{
//定義該圖形中所需的組件的引用
private Frame f;
private Button but;
//初始構造函數
FrameDemo(){
init();
}
//窗體創建與功能實現
public void init(){
//實例化組件
f = new Fame("my frame");
//對frame進行基本設置
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("my button");
//將組件添加到frame中
f.add(but);
//加載一下窗體上的事件
myEvent(but);
//顯示窗體
f.setVisible(true);
}
//註冊事件
private void myEvent(){
//窗體的關閉功能
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//讓按鈕具備退出程序的功能
/*
按鈕就是事件源。
那麼選擇哪個監視器呢?
通過關閉窗體事例瞭解到,想要知道哪個組件具備什麼樣的特有監聽器。
需要查看該組件對象的功能。
按鈕支持特有監聽addActionListener動態監聽
*/
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("退出");
System.exit(0);
}
});
}
public static void main(String[] args){
new FrameDemo();
}
}
鼠標活動事件
/*
常用方法:
void moiuseClicked(MouseEvent e)
鼠標按鍵在組件上單擊(按下並釋放)時調用
void moiuseEntered(MouseEvent e)
鼠標進入到組件上時調用
void moiuseExited(MouseEvent e)
鼠標離開組件時調用
void moiusePressed(MouseEvent e)
鼠標按鍵在組件上按下時調用
void moiuseReleased(MouseEvent e)
鼠標按鈕在組件上釋放時調用
*/
import java.awt.*;
import java.awt.event.*;
class MouseEvent{
//定義該圖形中所需的組件的引用
private Frame f;
private Button but;
MouseEvent(){
init();
}
public void init(){
f = new Fame("my frame");
//對frame進行基本設置
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("my button");
//將組件添加到frame中
f.add(but);
//加載一下窗體上的事件
myEvent(but);
//顯示窗體
f.setVisible(true);
}
private void myEvent(){
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//活動監聽
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionListener(){
System.out.println("action ok");
}
});
//判斷單擊
but.addMouserListener(new MouseAdapter(){
private int count =1;
private int clickCount = 1;
public void mouseEntered(MouseEvent e){
System.out.println("my button"+count++);
}
//點擊
public void mouseClicked(MouseEvent e){
System.ou.println("點擊動作"+clickCount++);
}
//雙擊判斷
public void mouseClicked(MouseEvent e){
if (e.getClickCount()==2){
System.ou.println("點擊動作"+clickCount++);
}
}
});
}
class {
public static void main(String[] args){
new MouseEvent();
}
}
鍵盤活動事件
/*
常用方法:
void keyPressed(KeyEvent e)
按下某個鍵時調用此方法
void keyReleased(KeyEvent e)
釋放某個鍵
void keyTyped(KeyEvent e)
鍵入某個鍵
*/
import java.awt.*;
import java.awt.event.*;
class {
public static void main(String[] args){
}
}
class MouseAndKeyEvent{
//定義該圖形中所需的組件的引用
private Frame f;
private Button but;
private TextField tf;
MouseAndKeyEvent(){
init();
}
public void init(){
f = new Fame("my frame");
//對frame進行基本設置
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("my button");
//文本框
tf = new TextField(10);
//將組件添加到frame中
f.add(but);
f.add(tf);
//加載一下窗體上的事件
myEvent(but);
//顯示窗體
f.setVisible(true);
}
private void myEvent(){
//限制文本框中只能輸入數字
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();//不會按照默認的方式處理此方式
}
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//活動監聽
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionListener(){
System.out.println("action ok");
}
});
//給but添加一個鍵盤監聽
but.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
//按esc結束
if (e.getKeyCode()==KeyEvent.VK_ESCAPE){
System.exit(0);
}
//System.ou.println(e.getKeyChar()+"..."+e.getKeyCode());//鍵與對應的碼值
//System.ou.println(KeyEvent.getKeyText(e.getKeyCode())+"..."+e.getKeyCode());//根據鍵獲取值,可以識別shift等鍵
}
});
//組合鍵
but.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if (e.isControlDown()&&e.getKeyCode()==KeyEvent.VE_ENTER){
System.out.println("ctrl+enter is run");
}
}
});
}
應用
對話框:Dialog
何時需要產生對話框:此對象時需要在調用時,才創建對象。如:當在誤操作的時候,就需要出現提示錯誤信息的對話框,此時才創建的這個對象。
Dialog(Frame owner,String title, boolean modal)
構造一個最初不可見的Dialog,它帶有指定的所以所有者Frame,標題和模式
演示用例:
列出指定目錄下的內容,當輸入的路徑不正確時,給出錯誤提示信息。
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 okBut;
//構造函數
MyWindowDemo(){
init();
}
//窗體基本設置於功能實現
public void init(){
f = new Frame("my window");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(60);
but = new Button("轉到");
ta = new TextArea(25,70);//25行,70列
d = new Dialog(f,"提升信息-self",true);//模式爲true,對話框不操作,窗體操作不了
d.setBounds(400,200,240,150);
lab = new Label();
okBut = new Button("確定");
//添加組件
d.add(lab);
d.add(okBut);
f.add(tf);
f.add(but);
f.add(ta);
//窗體事件
myEvent();
//窗體顯示
f.setVisible(true);
}
private void myEvent(){
//“跳轉”按鈕事件
okBut.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){
showDir();
}
});
//按鈕跳轉
buf.addActionListener(new ActionListener(){
showDir();
}
};)
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
private void showDir(){
String dirPath = tf.getText();//返回String類型的文本
File dir = new File(dirPath);//ta.setText(text);//轉到
//判斷輸入的路徑是否存在,且是否是文件夾
if (dir.exists()&&dir.isDirectory()){
tf.setText("");//清空文本區中的內容
String[] names = dir.list();
for (String name:names ){
ta.append(name+"\r\n");
}else{
String info = "您輸入的信息:"+dirPath+"是錯誤的。請重新輸入!";
lab.setText(info);
d.setVisible(true);
}
}
對列出指定目錄內容示例的功能增強。
菜單:Menu
1、菜單繼承關係
2、說明
1)Menu:菜單,繼承MenuItem;有右三角的圖標存在,可添加Menu和MenuItem
2)MenuBar:菜單欄,可添加菜單和菜單條目。一般先創建菜單欄,再創建菜單。
3)MenuItem:菜單條目,也稱菜單項,無右三角的圖標存在,是最終的菜單項。
4)菜單的事件處理和組件一樣,可以對類型爲MenuItem和Menu的對象這個事件源添加活動監聽ActionListener,並進行相關的事件處理。
5)通過setMenuBar()方法,將菜單添加到Frame中。
3、用到方法
MenuBar菜單欄
該框架的setMenuBar方法可以是該菜單欄與Frame對象關聯
MenuItem add(MenItem)
將指定的菜單項添加到此菜單
演示用例:
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組件完成一個簡單的記事本程序。
需求:具有文件菜單,文件中有打開,保存和退出功能。將寫好的程序變爲雙擊可執行的程序。
*/
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();
}
}