GUI
一、GUI
1.1、概述
GUI:Graphical User Interface(圖形用戶接口),用圖形的方式與用戶進行交互,使得操作更加簡單易懂,計算機的推廣很大的功勞來源於GUI。
CLI:CommandLine User Interface(命令行用戶接口),即Dos命令行操作,需要記住常用指令,早期的計算機就是這種形式,操作不直觀,windows系統中,基本被GUI替代,但在Linux系統中仍然有相當重要的地位。
在java中,操作GUI的組件以及方法等等都封裝在awt和swing兩個工具包中。
java.awt:Abstract Window Toolkit(抽象窗口工具包),重量級控件;需要調用本地系統方法實現功能。
Javax.Swing:是在awt的基礎上,建立的一套圖形化界面系統,輕量級控件;其中提供了更多的組件,而且完全由java實現,不依賴本地系統。
awt中常用組件的關係如下圖所示:
注意:Container:即容器,是一個特殊的組件,該組件中可以通過add方法添加其他的組件。
佈局管理器:即容器中各組件的排放方式。
常見的佈局管理器:
FlawLayout(流式佈局管理器):從左到右的順序排列,Panel默認;
BorderLayout(邊界佈局管理器):東、南、西、北、中,Frame默認;
GridLayout(網格佈局管理器):規矩的矩形;
CardLayout(卡片佈局管理器):選項卡;
GridBagLayout(網格包佈局管理器):非規則的矩形。
創建圖形化界面的步驟:
1、創建frame窗體;
2、對窗體進行基本設置;比如:大小、位置、佈局等等;
3、定義組件;
4、將組件通過窗體的add方法添加到窗體中;
5、讓窗體顯示,通過setVisible(true)完成。
1.2、事件監聽機制
事件監聽機制由事件源、事件、監聽器、事件處理四個部分組成。
事件源:就是awt或者swing包中的那些圖形界面組件;
事件:每一個事件源都有自己特有的對應事件和共性事件;
監聽器:用於封裝可以觸發某一事件的動作;
事件處理:以上三者,在java中都已經定義好了,直接獲取其對象即可;我們需要做的,就是事件處理。
事件監聽機制如下圖所示:
事件監聽機制的實現:1、確定事件源(容器或者組件);2、通過事件源對象的addXxxListener()方法將監聽器註冊到該事件源上;3、該方法接收的是XxxListener的子類對象,或者XxxAdapter的子類對象,一般用匿名內部類表示;4、覆蓋特定事件的方法。
注意:XxxAdapter是Xxxlistener的子類,複寫了所有的抽象方法,但由於創建對象無意義,所以XxxAdapter定義爲抽象類 。因爲WindowListener的子類windowAdapter已經實現了windowListener接口,並覆蓋了其中的所有方法,那麼我們只要繼承自windowadapter,並覆蓋我們需要的方法即可。總之,適配器繼承於監聽器,並覆蓋了相應的方法,使用適配器不必覆蓋多餘的方法。
常用的監聽器有:窗體監聽器WindowListener,活動監聽器ActionListener,鼠標監聽器MouseListener,鍵盤監聽器KeyListener。當監聽器有三個及三個以上的方法時,一般都有相匹配的適配器!
菜單
菜單:MenuBar、Menu、MenuItem;先創建菜單條,再創建菜單,每一個菜單中建立菜單項;也可以菜單添加到菜單中,作爲子菜單;通過setMenuBar()方法,將菜單添加到Frame中。
菜單的繼承關係如下圖所示:
1、基本的演示:
package itheima.day22;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo {
/*1、定義該圖形中所需的組件引用*/
private Frame f;
private Button but;
private TextField tf;//文本區域
FrameDemo(){
init();
}
public void init(){
f = new Frame("這是一個框架");
//對frame進行基本設置
f.setBounds(200, 300, 400, 500);//設置,位置,大小
f.setLayout(new FlowLayout());//設置流式佈局,默認是邊界佈局
but = new Button("一個按鈕");
tf = new TextField(20);//指定列數
//將組件添加到frame中
f.add(but);
f.add(tf);
//加載一下窗體上事件
myEvent();
//顯示窗體
f.setVisible(true);
}
private void myEvent(){
//給窗體增加監聽的功能,
f.addWindowListener(
new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {//關閉窗口
System.exit(0);
}
});
//按鈕的活動監聽
but.addActionListener(new ActionListener(){//活動監聽器
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("action ok");
// System.out.println("按鈕退出程序");
// System.exit(0);
}
});
//監聽鼠標事件
but.addMouseListener(new MouseAdapter(){//鼠標監聽器
int enter;
int clicked;
@Override
public void mouseClicked(MouseEvent e) {
if(e.getClickCount()==2)
System.out.println("雙擊按鈕:"+clicked++);
// System.out.println("點擊按鈕:"+clicked++);
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠標進入按鈕::"+enter++);
}
});
tf.addKeyListener(new KeyAdapter(){//鍵盤監聽器
@Override
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 FrameDemo();
}
}
2、演示在窗體中顯示文件列表
package itheima.day22;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
public 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("我的窗體");//創建窗體
f.setBounds(300,100,600,500);//設置位置,大小
f.setLayout(new FlowLayout());//設置流式佈局
tf = new TextField(70);//文本行
but = new Button("轉到");//按鈕
ta = new TextArea(25,70);//文本區域
d = new Dialog(f,"提示信息--self",true);//對話框,模式爲true,模態形式
d.setBounds(400,200,400,250);
d.setLayout(new FlowLayout());
lab = new Label();//標籤
okBut = new Button("確定");
d.add(okBut);//對話框中添加一個按鈕
d.add(lab);//對話框中添加一個標籤
f.add(tf);//給窗體添加組件
f.add(but);
f.add(ta);
myEvent();//事件監聽
f.setVisible(true);//可視化
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {//窗體的關閉功能
System.exit(0);
}
});
d.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {//對話框的關閉功能
d.setVisible(false);
}
});
tf.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {//文本行的接收鍵盤輸入的功能
if(e.getKeyCode() == KeyEvent.VK_ENTER)//回車
showDir();
}
});
okBut.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {//對話框中確定按鈕的活動監聽
d.setVisible(false);
}
});
but.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {//窗體中轉到按鈕的活動監聽
showDir();
}
});
}
private void showDir(){//顯示目錄
String dirPath = tf.getText();//獲取文本行裏面的內容
File dir = new File(dirPath);//封裝成爲一個File對象,方便操作
if(dir.exists() && dir.isDirectory()){//存在並且是一個文件夾
String[] names = dir.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();
}
}
3、演示打開保存文件的功能
package itheima.day22;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
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 MyMenuDemo {
private Frame f;//窗體
private MenuBar bar;//菜單欄
private Menu fileMenu,subMenu;//菜單
private MenuItem closeItem,subItem;//菜單條
private MenuItem openItem,saveItem;//打開、保存、菜單條
private FileDialog openDia,saveDia;//文件對話框
private TextArea ta;//文本區域,用於顯示打開文件的內容
private File file;//文件
MyMenuDemo(){
init();
}
public void init(){
//窗體
f = new Frame("my window");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
bar = new MenuBar();//菜單欄
fileMenu = new Menu("文件");
// subMenu = new Menu("子菜單");
subItem = new MenuItem("子條目");
closeItem = new MenuItem("退出");
openItem = new MenuItem("打開");
saveItem = new MenuItem("保存");
ta = new TextArea(30,60);
// subMenu.add(subItem);
// m.add(subMenu);
fileMenu.add(openItem);//菜單中加入打開菜單
fileMenu.add(saveItem);//保存
fileMenu.add(closeItem);//關閉
bar.add(fileMenu);//在菜單欄中添加菜單
f.setMenuBar(bar);//窗體中增加菜單欄
f.add(ta);//窗體中加入文本區域
openDia = new FileDialog(f,"打開",FileDialog.LOAD);//打開對話框
saveDia = new FileDialog(f,"保存",FileDialog.SAVE);//保存對話框
myEvent();//事件
f.setVisible(true);//窗體的可視化
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {//窗體關閉功能
System.exit(0);
}
});
closeItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {//關閉菜單項的關閉功能
System.exit(0);
}
});
openItem.addActionListener(new ActionListener(){//打開菜單項的活動監聽
@Override
public void actionPerformed(ActionEvent e) {
openDia.setVisible(true);//顯示打開對話框
String dirPath = openDia.getDirectory();
String fileName = openDia.getFile();
if(dirPath ==null || fileName == null)
return ;
ta.setText("");//清空文本區域
file = new File(dirPath,fileName);//將路徑和文件名封裝成爲對象
try {
BufferedReader bufr = new BufferedReader(new FileReader(file));//讀取文件中的數據
String line = null;
while((line = bufr.readLine())!= null)
{
ta.append(line +"\r\n");//追加到文本區域中
}
bufr.close();
} catch (IOException e1) {
throw new RuntimeException("文件讀寫異常");
}
}
});
saveItem.addActionListener(new ActionListener(){//保存菜單項的活動監聽
@Override
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);//封裝成FIle對象,方便操作
}
try {
BufferedWriter bufw = new BufferedWriter(new FileWriter(file));//寫入流
/*寫入到指定的文件中*/
String text = ta.getText();
bufw.write(text);
bufw.flush();
bufw.close();
} catch (IOException e1) {
throw new RuntimeException("文件讀寫異常");
}
}
});
}
public static void main(String[] args) {
new MyMenuDemo();
}
}