圖形化界面
1. GUI:Graphical User Interface,圖形化用戶接口
CLI:Command Line User Interface,命令行用戶接口區別:CLI需要記住一些命令,如果忘記了命令則很痛苦,而GUI則操作比較直觀、方便;
2.java.Awt和javax.Swing的區別:
java.Awt:抽象窗口工具包,需要本地系統方法實現,不易移植;
javax.Swing:在Awt基礎之上,完全由java實現,增強移植性。
3.繼承體系:Component組件
|--Container:容器,可以添加其它基本組件;
|--Window
|--Frame:窗體
|--Dialog:對話框
|--FileDialog:文本框對話框
|--Panel:面板
|--基本組件
|--Button:按鈕
|--Lable:標籤
|--CheckText:複選框
|--TextComponent:文本組件
|--TextField:文本框,單行文本
|--TextArea:文本域,多行文本
4.佈局管理器:
佈局:容器中組件的排放方式。
常見的佈局管理器:
FlowLayout:流式佈局,從左到右,默認居中,Panel的默認佈局;
BorderLayout:邊界式佈局,東南西北中,Frame的默認佈局;
GirdLayout:網格式佈局,存放在網格中,如計算器;
GirdBagLayout:網格包式佈局,不規則的矩陣。
還有一種座標式佈局,隨意放。
若有多種佈局,則添加Panel組件,將其他組件添加到Panel中,再將Panel按流式佈局。
5.創建組件演示,以Frame爲例。
Frame f=new Frame();//創建窗體對象;
f.setTitle("我的窗體");//設置窗體名稱
f.setSize(100,200);//設置窗體的長爲100,寬爲200;
f.setLocation(400,300);//設置窗體的頂點距左邊界400,距上邊界300;
f.setBounds(100,20,400,300);//這句話將第二句和第三句合併,一個意思;
f.setVisiable(true);//設置窗體可見
注意:開啓了圖形化界面後,多了線程。
6.事件監聽機制:
事件源:發生事件的組件對象,即awt包或者swing包中的那些圖形界面組件;
事件:每一個事件源都有自己的對應事件和共性事件;
事件監聽:對可能發生的事情的多個情況(動作)的封裝對象到了監聽器中,一般是個接口;
事情處理:重寫事件監聽裏面的功能。
7.GUI窗體事件
WindowListener:監聽器
註冊監聽器:1.匿名對象:用一個子類去實現接口,然後傳遞一個子類匿名對象即可;
2.匿名內部類:定義一個匿名內部類重寫接口中的方法;
f.addWindowListener(new WindowLisener());
這種採用的是直接添加事件監聽器接口,但太麻煩,因爲可能我們只需要實現其中一兩個事件,而它要求我們全部實現,
所以,這種方式不可取;後來,出現了事件監聽器的適配器,這個去實現事件監聽器接口,提供了空實現,在完成事件是,在那
個裏面完成某個功能,就重寫某個方法即可,不需要全部實現。
注意:不是所有的事件都有適配器的,如果方法較少是,不需要適配器。
8.代碼改進:封裝Frame,在main中調用方法;需求如圖:將文本框中的內容通過點擊轉到按鈕輸出文本域中
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test1 {
public static void main(String[] args) {
FrameTest f=new FrameTest();
}
}
class FrameTest{
private Frame f;
private TextField tf;
private Button bu;
private TextArea ta;
public FrameTest() {
init();
}
private void init() {
f=new Frame();//創建窗體
f.setBounds(400, 300, 400, 300);//設置窗體屬性
tf=new TextField(20);//創建一個文本框
ta=new TextArea(10,40);//創建一個文本域
bu=new Button("轉到");//創建按鈕
//添加組件到窗體
f.add(tf);
f.add(ta);
f.add(bu);
//添加事件
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
bu.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//獲取文本框的值
String s=tf.getText();
//清空文本框
tf.setText("");
//將獲得值寫入到文本域中,追加並換行
ta.append(s+System.getProperty("line.separator"));
}
});
}
}
9.菜單繼承體系:
MenuComponent:菜單組件
|--MenuBar:菜單欄
|--MenuItem:菜單項
|--Menu:菜單
FileDialog:文件對話框
getDictionary():獲取目錄;
getFile():獲取對話框中選定的文件;
setMode(status):設置文件對話框LOAD和SAVE模式。
10.我的菜單欄案例
MenuBar
文件(Menu)
|--更改標題(Menu)
|--好好學習(MenuItem)
|--天天向上(MenuItem)
|--恢復標題(MenuItem)
|--退出系統(MenuItem)
|--打開記事本 Runtime(MenuItem)
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) {
MenuTest mt=new MenuTest();
}
}
class MenuTest{
private Frame f;
private MenuBar mb;
private Menu m1,m2;
private MenuItem mi1,mi2,mi3,mi4,mi5;
protected String OldTitle;
public MenuTest() {
init();
OldTitle=f.getTitle();
}
private void init() {
f=new Frame();
f.setTitle("我的菜單案例");
f.setBounds(400,300,400,400);
//創建菜單組件
mb=new MenuBar();
m1=new Menu("文件");
m2=new Menu("更改標題");
mi1=new MenuItem("好好學習");
mi2=new MenuItem("天天向上");
mi3=new MenuItem("退出系統");
mi4=new MenuItem("打開記事本");
mi5=new MenuItem("恢復標題");
//誰添加誰
m2.add(mi1);
m2.add(mi2);
m2.add(mi5);
m1.add(m2);
m1.add(mi3);
m1.add(mi4);
mb.add(m1);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
private void myEvent() {
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
exit();
}
});
mi1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String s=mi1.getLabel();
changeTitle(s);
}
});
mi2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
String s=mi2.getLabel();
changeTitle(s);
}
});
mi3.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
exit();
}
});
mi4.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Runtime r=Runtime.getRuntime();
try {
r.exec("notepad.exe");
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
mi5.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
changeTitle(OldTitle);
}
});
}
//封裝修改標題的方法
protected void changeTitle(String s) {
f.setTitle(s);
}
//封裝退出方法
private void exit() {
System.exit(0);
}
}