一横朋、GUI 概述
1、概述:
1炊甲、GUI:Graphical User Interface,即圖形用戶界面欲芹,用于計算機與用戶交互的一種方式
2卿啡、計算機與用戶交互的形式:GUI和CLI
GUI: Graphical User Interface,圖形用戶接口菱父,用圖形方式颈娜,來顯示計算機操作界面,方便直觀浙宜。
CLI: Command Line User Interface官辽,命令行用戶接口,即常見的Dos命令行操作粟瞬,須記住一些命令同仆,不直觀。
3裙品、java也將這種界面封裝為對象俗批,其中的對象都放在了兩個包中:java.Awt包和javax.Swing包。
java.Awt包:Abstract Window Toolkit市怎,即抽象窗口工具箱岁忘。要調(diào)用本地系統(tǒng)方法實現(xiàn)功能,屬重量級控件区匠。
javax.Swing包:在AWT的基礎(chǔ)上建立的一套圖形界面系統(tǒng)干像,其中提供了更多的組件,且完全有java實現(xiàn),增強了移植性麻汰,屬輕量級控件速客。
2、繼承體系:
Container是一個容器什乙,通過add方法添加組件
3挽封、布局管理器:
1、布局:容器中的組件排列方式
2臣镣、常見的布局管理器:
1)FlowLayout:流式布局管理器辅愿,從左向右排列,是Panel默認的布局管理器
2)BorderLayout:邊界式布局管理器忆某,東南西北中的排列方式点待,是Frame的默認布局管理器
3)GridLayout:網(wǎng)格式布局管理器,規(guī)則的矩陣
4)CardLayout:卡片式布局管理器弃舒,即選項卡
5)GridBayLayout:網(wǎng)格包布局管理器癞埠,非規(guī)則矩陣
3、如果存在多種布局方式聋呢,如何創(chuàng)建窗體界面呢苗踪?步驟:
1)先將窗體Frame進行大區(qū)域的劃分,設(shè)置其布局管理器削锰,加入面板Panel
2)將組建加入Panel通铲,設(shè)置面板的布局管理器
示例:
import java.awt.*;
import java.awt.event.*;
class FrameDemo{
//定義該圖形中所需的組件引用
private Frame f;
private Button but;
FrameDemo(){
init();
}
//初始化組件
public void init(){
//對frame進行基本設(shè)置
f = new Frame("my frame");
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
but = new Button("button");
//將組件添加進窗體
f.add(but);
//加載一下窗體上事件
myEvent();
//顯示窗體
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(ActionEvent e){
System.out.println("button 關(guān)閉的窗口");
System.exit(0);
}});
}
public static void main(String[] args)
{
new FrameDemo();
}
}
4、創(chuàng)建圖形化界面思路:
1器贩、創(chuàng)建Frame容器:Frame f = new Frame("my Frame");可設(shè)置標(biāo)題
2颅夺、對窗體進行設(shè)置:如大小,位置蛹稍,布局等吧黄。
f.setSize(int wight,int hight);
f.setLocation(int x,int y)唆姐,設(shè)置橫縱坐標(biāo)拗慨;
f.setBounds(int wight,int hight,int x,int y),者直接用這個對大小和位置設(shè)置
f.setLayout(Layout layout)奉芦,參數(shù)為指定的布局管理器胆描,如FlowLayout
3、定義組件:如Button b = new Button(“Button”)仗阅,可設(shè)置組件的名稱
4、將組件通過窗體的add方法添加到窗體中国夜,f.add(b)减噪;
5、讓窗體顯示,通過setVisible(boolean b)筹裕,通過設(shè)置參數(shù)是true還是false是否顯示窗體
5醋闭、事件監(jiān)聽機制
一)的特點:
1、事件源(組件):awt或swing包中的那些圖形界面組件
2朝卒、事件(Event):每一個事件源都有自己特有的對應(yīng)的時間和共性事件
3证逻、監(jiān)聽器(Listener):將可觸發(fā)某一事件的動作(不止一個),都封裝到監(jiān)聽器中抗斤。注意囚企,是動作封裝到監(jiān)聽器中。
4瑞眼、事件處理:引發(fā)事件后的處理方式龙宏。
二)說明:
前三個在java中都已將定義好了,直接獲取其對象來用即可伤疙,我們需要做的就是對產(chǎn)生的動作進行處理银酗,步驟:
1、明確監(jiān)聽器(Frame)將監(jiān)聽器注冊到上面徒像,通過方法:addWindowListener(WindowListener w)
2黍特、注意:若用子類實現(xiàn)WindowListener接口,就需要覆蓋其中的7個方法锯蛀,可只用到其中的關(guān)閉動作灭衷,其他動作未用到,就必須重寫全部谬墙,因為WindowLister的子類WindowAdapter以實現(xiàn)此接口今布,并覆蓋了其中所有方法,則只需繼承WindowAdapter拭抬,覆蓋需要的方法即可部默。
3、明確事件造虎,并對事件進行處理傅蹂,其實,添加什么監(jiān)聽器就需要添加什么事件算凿。
示例一:鼠標(biāo)和鍵盤事件
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent
{
//創(chuàng)建全局變量
private Frame f = null;
private Button but = null;
private TextField tf;
//初始化窗體
MouseAndKeyEvent(){
init();
}
//創(chuàng)建窗體
public void init(){
f = new Frame("my frame");
f.setBounds(300,200,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(20);
but = new Button("button");
f.add(tf);
f.add(but);
myEvent();
f.setVisible(true);
}
//注冊事件
private void myEvent(){
//添加監(jiān)聽器份蝴,引發(fā)退出事件
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}});
//給but添加一個活動監(jiān)聽器
but.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("action ok");
}});
//給文本框添加一個監(jiān)聽器,引發(fā)鍵盤事件
tf.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
int code = e.getKeyCode();
System.out.println(e.getKeyChar() + "..." + e.getKeyChar());
if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)){
e.consume();
System.out.println(code + "是非法的");
}});
//鼠標(biāo)事件
//myMouseEvent();
//鍵盤事件
myKeyEvent();
}
//鼠標(biāo)事件
public void myMouseEvent(){
//給but添加一個鼠標(biāo)監(jiān)聽器
but.addMouseListener(new MouseAdapter(){
private int count = 1;
private int clickCount = 1;
private int clickCount2 = 1;
public void mouseEntered(MouseEvent e){
System.out.println("鼠標(biāo)進入該組件" + count++);
}
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2)
System.out.println("雙擊動作" + clickCount2++);
//System.out.println("點擊動作" + clickCount++);
}});
}
//鍵盤事件
public void myKeyEvent(){
//給but添加一個鍵盤監(jiān)聽器
but.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
//組合鍵ctrl鍵和回車鍵同時觸發(fā)
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("ctrl+enter is runing");
//System.out.println(e.getKeyChar() + "..." + e.getKeyCode());
//System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + "..." + e.getKeyChar());
}
});
}
public static void main(String[] args)
{
new MouseAndKeyEvent();
}
}
二氓轰、應(yīng)用
1婚夫、何時需要產(chǎn)生對話框:
此對象時需要在調(diào)用時,才創(chuàng)建對象的署鸡,如:當(dāng)在誤操作的時候案糙,就會出現(xiàn)提示錯誤信息的對話框限嫌,此時才創(chuàng)建的這個對象。
2时捌、菜單:Menu
1怒医、Menu:菜單,Menu extends MenuItem奢讨;有右三角的圖標(biāo)存在稚叹,可添加Menu和MenuItem
2、MenuBar:菜單欄拿诸,可添加菜單和條目
3扒袖、MenuItem:條目,及菜單項目佳镜,無右三角的圖標(biāo)存在僚稿,是最終的菜單項。
4蟀伸、菜單的事件處理和組件一樣蚀同,可以對類型為MenuItem和Menu的對象這個事件源添加活動監(jiān)聽ActionListener,并進行相關(guān)的事件處理啊掏。
示例:
3蠢络、jar包雙擊執(zhí)行:
既然是圖形化界面,就需要通過圖形化界面的形式運行程序迟蜜,而不是是用Dos命令行執(zhí)行刹孔,那么如何通過雙擊程序就執(zhí)行程序呢?這就需要將程序的class文件打包娜睛,
步驟如下:
1髓霞、首先要在Java文件中導(dǎo)入一個包,沒有則需創(chuàng)建一個包畦戒,如package mymenu;
2方库、生成包:通過編譯javac -d c:\myclass MyMenu.java,此時則在c盤下的myclass文件夾下生成了所有的.class文件
3障斋、在此目錄下新建一個文件纵潦,如1.txt或者其他任意名稱任意擴展名的文件都可,然后在其中編輯固定的格式:“Main-Class: mymenu.MenuDemo”垃环,只寫引號中的內(nèi)容邀层。需要需要在冒號后有一個空格,在文件末尾要回車遂庄。
4寥院、編譯:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息涛目,則直接編譯jar即可得出相應(yīng)的命令
5只磷、此時雙擊即可執(zhí)行经磅。
說明:
1)在固定格式中:
a.如果無空格:在編譯的時候,就會報IO異常钮追,提示無效的頭字段,即invalid header field阿迈。這說明1.txt在被IO流讀取元媚。
b.如果無回車:在列表清單.MF中不會加入相應(yīng)的加載主類的信息,也就是說配置清單的屬性主類名稱不會加載進清單中苗沧,也就不會執(zhí)行刊棕。
2)jar文件必須在系統(tǒng)中注冊,才能運行待逞。注冊方法如下:
A.對于XP系統(tǒng):
a.打開任意對話框甥角,在菜單欄點擊工具按鈕,選擇文件夾選項
b.選擇新建--->擴展名识樱,將擴展名設(shè)置為jar嗤无,確定
c.選擇高級,可更改圖標(biāo)怜庸,然后點擊新建当犯,命名為open,
d.在用于可執(zhí)行應(yīng)用程序中割疾,點瀏覽嚎卫,將jdk下的bin的整個文件路徑添加進來,并在路徑后添加-jar即可宏榕。
B.對于win7系統(tǒng):
a.改變打開方式:右擊.jar文件拓诸,點擊打開方式,選擇默認程序為jdk下bin中的javaw.exe應(yīng)用程序麻昼。
b.修改關(guān)聯(lián)程序的注冊表:打開注冊表(win+r)奠支,找到注冊表路徑\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command
下的字符串值,右擊點修改涌献,將值改為:"C:\Program Files\Java\jre6\bin\javaw.exe" -jar "%1"
其中-jar前的路徑就是javaw.exe的路徑胚宦。保存
c.雙擊即可執(zhí)行jar程序,如果仍不能執(zhí)行燕垃,則需下載最新版的jdk枢劝。
示例一:
打開指定目錄下的目錄條目
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo
{
//創(chuàng)建全局變量
private Frame f;
private Button but;
private TextField tf;
private TextArea ta;
private Dialog d;
private Label lab;
private Button okBut;
//構(gòu)造函數(shù),初始化窗體
MyWindowDemo()
{
init();
}
//創(chuàng)建窗體和組件卜壕,并將事件添加進來
public void init()
{
//設(shè)置窗體
f = new Frame("my window");
f.setBounds(300,200,600,500);
f.setLayout(new FlowLayout());
//創(chuàng)建組件
but = new Button("轉(zhuǎn)到");
tf = new TextField(60);
ta = new TextArea(25,75);
d = new Dialog(f,"提示信息-self",true);
d.setBounds(300,100,300,150);
d.setLayout(new FlowLayout());
lab = new Label();
okBut = new Button("確定");
//將組件添加到窗體
f.add(tf);
f.add(but);
f.add(ta);
d.add(lab);
d.add(okBut);
//添加事件
myEvent();
//設(shè)置窗體可見
f.setVisible(true);
}
//常見引發(fā)的時間
private void myEvent()
{
//給but添加一個活動監(jiān)聽器
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
showInfo();
}
});
okBut.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
//給文本框添加鍵盤事件
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showInfo();
}
});
//關(guān)閉窗體事件
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//給對話框添加一個監(jiān)聽器您旁,關(guān)閉對話框事件
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
}
//操作文件,對文件夾的內(nèi)容讀取
private void showInfo()
{
String dirPath = tf.getText();
File file = new File(dirPath);
if(file.exists()&&file.isDirectory())
{
ta.setText("");
String[] names = file.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();
}
}
示例二:
打開文件鹤盒,將內(nèi)容顯示在文本框中蚕脏,并將寫入文本框中的內(nèi)容保存
/*
菜單練習(xí)
*/
package mymenu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MenuDemo
{
//設(shè)置全局變量
private Frame f;
private MenuBar bar;
private TextArea ta;
private Menu fileMenu;
private MenuItem closeMT,submu,openItem,saveItem;
private FileDialog openDia,saveDia;
private File file;
//初始化菜單項
MenuDemo()
{
init();
}
//初始化窗體和組件
public void init()
{
//初始化窗體frame
f = new Frame("my Menu");
f.setBounds(300,100,600,500);
//初始化菜單項
bar = new MenuBar();
ta = new TextArea();
fileMenu = new Menu("文件");
submu = new MenuItem("子條目");
openItem = new MenuItem("打開");
saveItem = new MenuItem("保存");
closeMT = new MenuItem("退出");
//將組件加入到文件菜單這個容器組件中
fileMenu.add(submu);
fileMenu.add(openItem);
fileMenu.add(saveItem);
bar.add(fileMenu);
f.setMenuBar(bar);
fileMenu.add(closeMT);
openDia = new FileDialog(f,"我要打開",FileDialog.LOAD);
saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);
f.add(ta);
//添加事件
myEvent();
//設(shè)置窗體可見性
f.setVisible(true);
}
//添加事件
private void myEvent()
{
//添加窗體監(jiān)聽,關(guān)閉按鈕
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//添加退出菜單項目的監(jiān)聽侦锯,退出程序
closeMT.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
//添加打開和保存文件的監(jiān)聽驼鞭,獲取文件
//打開事件
openItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//顯示對話框,并獲取文件路徑及文件名
openDia.setVisible(true);
String dirPath = openDia.getDirectory();
String fileName = openDia.getFile();
//判斷文件及路徑是否存在
if(dirPath==null || fileName==null)
return ;
//在打開一個文件前先清空文本框的內(nèi)容
ta.setText("");
file = new File(dirPath,fileName);
BufferedReader bufr = null;
try
{
//讀取文件中的內(nèi)容
bufr = new BufferedReader(new FileReader(file));
String line = null;
while((line=bufr.readLine())!=null)
{
ta.append(line+"\r\n");
}
}
catch (IOException ex)
{
throw new RuntimeException("讀取失敗");
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException ex)
{
throw new RuntimeException("關(guān)閉流失敗");
}
}
}
});
//保存事件
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);
BufferedWriter bufw = null;
try
{
//寫入文本框中的內(nèi)容
bufw = new BufferedWriter(new FileWriter(file));
String text = ta.getText();
bufw.write(text);
bufw.flush();
}
catch (IOException ex)
{
throw new RuntimeException("寫入失敗");
}
finally
{
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException ex)
{
throw new RuntimeException("關(guān)閉流失敗");
}
}
}
}
});
}
public static void main(String[] args)
{
new MenuDemo();
}
}