1,簡介
GUI
Graphical User Interface(圖形用戶接口).
用圖形的方式,來顯示計算機操作的界面,這樣更方便更直觀
CLI
Command line User Interface(命令行接口)
就是常見的Dos命令行操作
需要記憶一些常用的命令,操作不直觀
java 爲GUI提供的對象都在java.Awt和javax.Swing兩個包中。
Awt和Swing
java.Awt:Absttact Window ToolKit(抽象窗口工具包),需要調用本地系統方法實現功能。屬於重量級控件。對系統依賴性較強
javax.Swing:在Awt的基礎上,建立一套 圖形界面系統,其中提供了更多的組件,而且完全有java實現。增強了可移植性,屬於輕量級別控件
繼承關係圖
Container:爲容器,是一個特殊的組件,該組件可以通過add方法添加其他組件進來
佈局管理器
容器中的組件的排放方式,就是佈局
常見的佈局管理器
FlowLayout(流式佈局管理器)
從左到右的順序排列
Panel默認的佈局管理器
BorderLayout(邊界佈局管理器)
東,南,西,北中
Frame默認的佈局管理器
GridLayout(網格佈局管理器)
規則的矩陣
GardLayout(卡片佈局管理器)
非規則的矩陣
2,Frame
Frame基本界面步驟。代碼如下:
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
/*
* 創建圖形化界面
* 1,對窗體進行基本設置
* 2,對窗體進行基本設置
* 比如大小,位置,佈局
* 3,定義組件
* 4,將組件通過窗體的add方法添加到窗體中。
* 5,讓窗體顯示,通過setVisible(true)完成
*/
public class Test1 {
public static void main(String[] args) {
Frame f = new Frame("my awt");// 初始化不可見的,默認佈局管理器,邊界是佈局,如果沒有指定東南西北,就全部填充
f.setSize(500, 100);// 設置橫縱座標
f.setLocation(300, 200);// 距離左上角的左邊的位置,上邊的位置
f.setLayout(new FlowLayout());
Button b = new Button("按鈕");
f.add(b);
f.setVisible(true);// 設置可見的
// System.out.println("Hello world");
}
}
3,事件監聽機制
事件源(組件)
事件(Event)
監聽器 (Lisener)
事件處理(引發事件處理方式)
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/*
* 事件監聽機制的特點:
* 1,事件源
* 2,事件
* 3,監聽器
* 4,事件處理
* 事件源:就是awt包中或者swing包中的那些圖形界面組件
* 事件:每一個事件源都有自己特有的對應事件和共性事件
* 監聽器:將可以觸發某一個事件的動作都已經封裝了監聽器中。
* 以上三者:在java中都已經定義好了。
* 直接獲取其對象來用就可以了。
* 我們要做的事情是,就是對產生的動作進行處理。
*/
public class Test2 {
public static void main(String[] args) {
Frame f = new Frame("my awt");// 初始化不可見的,默認佈局管理器,邊界是佈局,如果沒有指定東南西北,就全部填充
f.setSize(500, 100);// 設置橫縱座標
f.setLocation(300, 200);// 距離左上角的左邊的位置,上邊的位置
f.setLayout(new FlowLayout());
Button b = new Button("按鈕");
f.add(b);
f.setVisible(true);// 設置可見的
f.addWindowListener(new MyWin());// 添加監聽器,監聽器裏面定義的都是動作
// 匿名內部類的方法如下
/*
* f.addWindowListener(new WindowAdapter(){ public void
* windowClosing(WindowEvent e){ System.out.println("關閉");
* System.exit(0); }
*
* });
*/
// System.out.println("Hello world");
// WindowAdapter 實現了WindowListener接口
}
}
/*
* //覆蓋了7個方法。可是我只用到了關閉動作 //其他動作卻必須重寫 class MyWin implements WindowListener{
*
* @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated
* method stub
*
* }
*
* @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated
* method stub
*
* }
*
* @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated
* method stub
*
* }
*
* @Override public void windowDeactivated(WindowEvent e) { // TODO
* Auto-generated method stub
*
* }
*
* @Override public void windowDeiconified(WindowEvent e) { // TODO
* Auto-generated method stub
*
* }
*
* @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated
* method stub
*
* }
*
* @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated
* method stub
*
* } }
*/
// 因爲WindowListener子類已經實現了WindwoListerer接口
// 並覆蓋了其中所有的方法,那麼我只要繼承自Windowadapter覆蓋我需要的方法即可
class MyWin extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.out.println("關閉");
System.exit(0);
}
}
4 Action事件
組件活動時觸發 代碼如下:
import java.awt.*;
import java.awt.event.*;
public class Test3 {
// 初始化
Frame f = null;
Button but = null;
public Test3() {
init();
}
public void init() {
f = new Frame("my Frame");
f.setBounds(300, 100, 600, 500);// 相當於setsize();setlocation();座標和寬度高度
f.setLayout(new FlowLayout());
but = new Button("my button");
// 價值窗體事件
myEvent();
f.add(but);
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
// 讓按鈕具備退出程序功能
/*
* 按鈕就是事件源 那麼選擇那個監聽器呢? 通過關閉窗體瞭解到,想要知道那個組件具備什麼樣的特有監聽器 需要查看該組件對象的功能
* (具體的組件支持哪些監聽,只有組件自己知道,添加監聽的方法肯定定義在組件自己內部)
*/
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {// 添加活動監聽,所以參數是活動事件
// TODO Auto-generated method stub
System.out.println("退出按鈕做的事");
System.exit(0);
}
});// 由於接口方法只有一個,所以不需要適配器,方法超過三個的幾乎有適配器
}
public static void main(String[] args) {
new Test3();
}
}
5 鼠標事件
在任何組件上都可以發生鼠標事件,入:鼠標進入組件,退出組件,在組件上方單機鼠標,
拖動鼠標都發生鼠標事件,也就是說,組件可以成爲發生鼠標事件的事件源
事件類型是MouseEvent,即當發生鼠標事件時,MouseEvent類自動創建一個事件對象。
MouseEvent類中有幾個重要的方法。
1,getX();事件源的x座標
2,getY();事件源的y座標
3,getModifiers()獲取鼠標的左鍵或右鍵。鼠標的左鍵和右鍵分別使用InputEvent類中的常量BUTTONI_MASK和BUTTON3來表示
4,getClickCount()獲取鼠標被單機的次數
import java.awt.*;
import java.awt.event.*;
/*
* 演示鼠標事件
*/
public class Test4 {
// 初始化
Frame f = null;
Button but = null;
public Test4() {
init();
}
public void init() {
f = new Frame("my Frame");
f.setBounds(300, 100, 600, 500);
f.setLayout(new FlowLayout());
but = new Button("my button");
// 價值窗體事件
myEvent();
f.add(but);
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
but.addMouseListener(new MouseAdapter() {
private int count = 1;
private int clickcount = 1;
public void mouseEntered(MouseEvent e) {
System.out.println("鼠標進入到該組件" + count++);
}
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2)
System.out.println("雙擊動作!" + clickcount++);
}
});
}
public static void main(String[] args) {
new Test4();
}
}
6 鍵盤事件,文本框只能輸入數字,組合鍵
在java事件模式中,必需有發生事件的事件源. 當一個組件處於激活狀態時.敲擊任何一個鍵,就會發生鍵盤事件.
具體的看代碼示例 如下:
import java.awt.*;
import java.awt.event.*;
/*
* 演示鼠標事件
*/
public class Test5 {
// 初始化
Frame f = null;
Button but = null;
TextField tf = null;
public Test5() {
init();
}
public void init() {
f = new Frame("my Frame");
f.setBounds(300, 100, 600, 500);
f.setLayout(new FlowLayout());
tf = new TextField(20);// 指定列數初始化,要求只能輸入數字
but = new Button("my button");
// 價值窗體事件
myEvent();
f.add(tf);
f.add(but);
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
// 給but添加一個鍵盤事件
but.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {// 按下ctrl加上enter鍵組合鍵
System.out.println("ctrl enter is run");
}
if (e.getKeyCode() == KeyEvent.VK_ENTER) {// 按下enter鍵退出
System.exit(0);
}
System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + ".."
+ e.getKeyCode());
}
});
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();// 不準備用默認的方式處理事件,默認是輸入進去
}
}
});
}
public static void main(String[] args) {
new Test5();
}
}
7 Dialog 列出指定目錄的內容,不存在的顯示 示例
Dialog類和Frame類都是window的子類。對話框必須依賴於某個窗口或組件,當它所依賴的窗口或組件消失時,對話框也消失;當它所依賴的窗口或組件可見時,對話框會自動恢復。
主要方法
Dialog(Frame f,String s):構造一個具有標題s的初始化不可見的對話框,所依賴的窗口。
Dialog(Frame f,String s,boolean b):構造一個具有標題s的初始化不可見的對話框所依賴的窗口,b決定對話框是有模式或無模式。
getTitle();獲取對話框標題
setTitle();設置對話框的標題
setModel(boolean b)設置對話框的模式
setSize();設置對話框的大小
setVisible(boolean b)
對話框的模式
有模式對話框:對話框牌激活狀態,只讓程序響應對話框內部的事件,程序不能再激活它所依賴的窗口或組件,並堵塞其他線程的執行。
無模式對話框處於非激活狀態,程序仍能激活它所依賴的窗口或組件,它也不堵塞線程的執行
import java.awt.*;
import java.awt.event.*;
import java.io.File;
/*
* 列出指定目錄的內容
*/
public class Test6 {
private Frame f;
private TextField tf;
private Button btn;
private TextArea ta;
private Dialog d;
private Label lbl;
private Button okbtn;
public Test6() {
init();
}
public void init() {
f = new Frame("my window");
f.setBounds(300, 100, 600, 600);
f.setLayout(new FlowLayout());
tf = new TextField(30);
btn = new Button("轉到");
ta = new TextArea(15, 40);
d = new Dialog(f, "提示信息——自己的self", true);// true代表如果不操作對話框,模式操作不了
d.setBounds(400, 200, 200, 100);
d.setLayout(new FlowLayout());
lbl = new Label();
okbtn = new Button("確定");
d.add(lbl);
d.add(okbtn);
f.add(tf);
f.add(btn);
f.add(ta);
myEvent();
f.setVisible(true);
}
public void myEvent() {
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
show();
}
}
});
okbtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
d.setVisible(false);
}
});
d.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
d.setVisible(false);
}
});
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
show();
}
});
}
public static void main(String[] args) {
new Test6();
}
private void show() {
String path = tf.getText();
File dir = new File(path);
if (dir.isDirectory() && dir.exists()) {
String[] names = dir.list();
ta.setText("");
for (String name : names) {
ta.append(name + "\r\n");
}
tf.setText("");
} else {
String info = "您輸入的信息:" + path + "是錯誤的的";
lbl.setText(info);
d.setVisible(true);
}
}
}
8,MenuBar,包含子菜單選項
菜單是窗口中常見的界面,是由
菜單項 (MenuBar) 菜單(Menu) 菜單項(MenuItem) 複選菜單項(CheckboxMenuItem)等對象組成
MenuBar 就是負責創建菜單條的,即MenuBar的一個實例就是一個菜單項。MenuBar bar=new MenuBar();
Frame類有一個將菜單條放置到窗口中的方法,其一般格式爲:setMenuBar(MenuBar menubar);,只能向窗口添加一個菜單條
Menu()建立一個空標題的菜單
Menu(String s)建立一個指定標題菜單,由參數s確定
若要創建菜單Menu,並添加到空菜單條對象bar中,可執行:Menu m1=nw Menu("file"); bar.add(m1);
MenuItem 類負責爲菜單創建菜單項,或爲每個菜單項創建其包含的更小的菜單子項MenuItem,並把菜單子項添加到菜單項中。
MenuItem open=new MenuItem("open"); m1.add(open);
import java.awt.*;
import java.awt.event.*;
public class Test7 {
private Frame f;
private MenuBar mb;
private Menu m, subMenu;
private MenuItem coloseItem, subItem;
public Test7() {
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("子條目");
coloseItem = new MenuItem("退出");
subMenu.add(subItem);
m.add(subMenu);
m.add(coloseItem);
mb.add(m);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new Test7();
}
}
9,FileDialog一個簡單的保存文件讀取文件的文本編輯器。
是Dialog的子類
FileDialog(Dialog parent,String title, int mode)
zh_cn |
如果 mode
的值爲 LOAD
,那麼文件對話框將查找要讀取的文件,所顯示的文件是當前目錄中的文件。如果mode
的值爲SAVE
,則文件對話框將查找要寫入文件的位置。
parent |
|
|
title |
null 值時不會拋出 NullPointerException |
|
mode |
FileDialog.LOAD 或 FileDialog.SAVE |
import java.awt.*;
import java.awt.event.*;
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 Test8 {
private Frame f;
private MenuBar mb;
private Menu fileMenu;
private MenuItem openItem, saveItem, closeItem;
private FileDialog openDia, saveDia;
private TextArea ta;
private File file;
public Test8() {
init();
}
public void init() {
f = new Frame("my window");
f.setBounds(300, 100, 500, 600);
mb = new MenuBar();
fileMenu = new Menu("文件");
openItem = new MenuItem("打開");
saveItem = new MenuItem("保存");
closeItem = new MenuItem("退出");
ta = new TextArea();
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
mb.add(fileMenu);
f.setMenuBar(mb);
f.add(ta);
openDia = new FileDialog(f, "我要打開", FileDialog.LOAD);
saveDia = new FileDialog(f, "我要保存", FileDialog.SAVE);
myEvent();
f.setVisible(true);
}
private void myEvent() {
saveItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (file == null) {
saveDia.setVisible(true);
String path = saveDia.getDirectory();// 得到文件夾
String name = saveDia.getFile(); // 得到文件名字
if (path == null || name == null) {
return;
}
file = new File(path, name);
}
try {
BufferedWriter bufw = new BufferedWriter(new FileWriter(
file));
String text = ta.getText();
bufw.write(text);
bufw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
openItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
openDia.setVisible(true);
String path = openDia.getDirectory();// 得到文件夾
String name = openDia.getFile(); // 得到文件名字
// System.out.println(path+"..."+name);
if (path == null || name == null) {
return;
}
file = new File(path, name);
ta.setText("");
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String text = ta.getText();
String line = null;
try {
while ((line = br.readLine()) != null) {
ta.append(line + "\r\n");
}
br.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
}
public static void main(String[] args) {
new Test8();
}
}