GUI即時圖形化界面圖形化界面方便較命令行模式更加簡單明瞭,易於操作。圖形化界面提供的隊形都在java.awt和javax.Swing中。Awt相對比較依賴於平臺。
1.創建圖形化界面的步驟:
1.創建Frame窗體
2.對窗體進行基本設置,比如大小,位置,佈局
3.定義組件
4.將組件通過窗體的add方法添加到窗體中,
5.讓窗體顯示,通過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.setVisible(true);
System.out.println("Hello word");
}
}
2.事件監聽機制
特點:事件源,事件,監聽器,事件處理,這些都已經在java中定義好了,直接獲取對象就可以了
事件源:就是awt包或者swing包中的那些圖形界面組件。
事件:每一個事件源都有自己特有的對應事件和共性事件
監聽器:將可以觸發一個事件的動作都已經封裝到了監聽器中
import java.awt.*;
import java.awt.event.*;
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 WindowAdapter(){
public void windowClosing(WindowEvent e)//複寫WindowListener的關閉方法
{
System.out.println("我被關了啦"+e.toString());
System.exit(0);
}
public void windowActivated(WindowEvent e)
{
System.out.println("我活了");//被前置
}
public void windowOpened(WindowEvent e)
{
System.out.println("我被打開了");
}
}
); //創建一個匿名內部類,此類是WindowListener的子類
f.setVisible(true); //通過ture值,使frame窗口可見
}
}
然後實現按鈕的關閉功能
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
private Frame f;//聲明私有成員變量窗體
private Button but;//聲明私有成員變量按鈕
FrameDemo()//構造函數
{
init();
}
public void init()
{
f=new Frame(); //創建窗體對象
//對窗體進行基本設置
f.setBounds(300,100,600,500);//座標值和寬高
f.setLayout(new FlowLayout());//單獨指定佈局管理器,避免整個填充
but=new Button("my button");//創建按鈕
f.add(but);//添加組件到窗體裏
myEvent(); //加載窗體上的事件
f.setVisible(true);//顯示窗體
}
public void myEvent()//將監聽器單獨封裝成方法
{
f.addWindowListener(new WindowAdapter() //將監聽器添加到窗體中,並引用匿名內部類,實例化監聽器的各種方法
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//讓按鈕具備退出功能
but.addActionListener(new ActionListener()
//調用匿名內部類,複寫按鈕監聽器中的actionPerformed方法,執行退出操作
{
public void actionPerformed(ActionEvent e)
{
System.out.println("退出,按鈕執行");
System.exit(0);
}
});
}
public static void main(String[] args)
{
new FrameDemo();
}
}
鼠標和鍵盤事件:
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent
{
private Frame f; //聲明私有成員變量窗體
private Button but; //聲明私有成員變量按鈕
private TextField tf; //聲名變量文本框
MouseAndKeyEvent() //構造函數
{
init();
}
public void init()
{
f=new Frame(); //創建窗體對象
//對窗體進行基本設置
f.setBounds(300,100,600,500); //座標值和寬高
f.setLayout(new FlowLayout()); //單獨指定佈局管理器,避免整個填充
tf=new TextField(20); //創建文本框,10是添加的列數
but=new Button("my button"); //創建按鈕
f.add(but); //添加組件到窗體裏
f.add(tf); //添加文本框到窗體中
myEvent(); //加載窗體上的事件
f.setVisible(true); //顯示窗體
}
private void myEvent() //將監聽器單獨封裝成方法
{
f.addWindowListener(new WindowAdapter() //將監聽器添加到窗體中,並引用匿名內部類,實例化監聽器的各種方法
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
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(); //使用此事件,將會不再按照默認的方式處理。
//在這裏,原本輸入除了數字之外的字符也都會進入文本框,
//採用這個事件之後,除數字之外的字符不再進入文本框
}
}
});
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("action ok");
}
}); //發現鼠標點擊會先於按鈕活動按鈕
but.addMouseListener(new MouseAdapter() //給button添加鼠標監聽
//調用匿名內部類,複寫按鈕監聽器中的mouseEntered方法,實現鼠標進入事件
{
private int count=1; //定義一個計數器
private int ck=1;
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠標進入到該組件"+count++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2) //鼠標雙擊動作
System.out.println("雙擊動作"+ck++);
}
});
but.addKeyListener(new KeyAdapter() //給按鈕添加鍵盤監聽
{
public void keyPressed(KeyEvent e)
{
/*
if(e.getKeyCode()==KeyEvent.VK_ENTER) //如果按到enter鍵是退出
System.exit(0);
*/
//組合鍵操作
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER)
System.out.println("ctrl+enter 是運行了");
//獲取鍵盤碼和對應的鍵名
//System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"--"+e.getKeyCode());
}
});
}
public static void main(String[] args)
{
new MouseAndKeyEvent();
}
}
練習:列出指定目錄內容
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 okbu; //引用按鈕變量,應用於對話框中
MyWindowDemo()
{
init();
}
public void init()
{
f=new Frame("my window"); //創建一個窗體
f.setBounds(300,100,600,400); //設置窗體的位置,寬高
f.setLayout(new FlowLayout()); //設置成流佈局
tf=new TextField(30); //新建文本框,設置列數是30
but=new Button("轉到"); //新建按鈕
ta=new TextArea(10,40); //新建文本編輯區域,15行40列
d=new Dialog(f,"提示信息-self",true); //新建一個對話框,true值表示當前窗口不處理就無法處理後置窗口
d.setBounds(400,200,200,150); //設置對話框的位置和寬高
d.setLayout(new FlowLayout()); //設置對話框佈局爲流式佈局
lab=new Label(); //創建標籤
okbu=new Button("確定"); //創建對話框中的按鈕
d.add(lab);
d.add(okbu);
f.add(tf);
f.add(but);
f.add(ta);
myEvent();
f.setVisible(true); //設置窗口可視
}
private void myEvent()
{
okbu.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)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});
but.addActionListener(new ActionListener() //添加窗體監聽器
{
public void actionPerformed(ActionEvent e) //操作時調用
{
showDir(); //在操作時調用目錄轉入文本區功能函數
}
});
f.addWindowListener(new WindowAdapter() //添加窗體關閉方法,複寫關閉方法
{
public void windowClosing(WindowEvent e)
{
System.exit(0); //退出窗體
}
});
}
private void showDir() //輸入目錄後轉入文本區的功能封裝成一個方法
{
String dirPath=tf.getText(); //獲取文件目錄文本
File dir=new File(dirPath); //將目錄封裝成文件對象,只有封裝成文件對象,才能找到目錄下的文件列表
if(dir.exists() && dir.isDirectory()) //確保目錄存在
{
ta.setText(""); //清空之前的目錄
String[] names=dir.list(); //將文件列表存入數組中
for(String name:names)
{
ta.append(name+"\r\n"); //遍歷數組,將目錄添加到文本區
}
}
else //如果目錄不存在的處理方式
{
String info="您輸入的路徑"+dirPath+"不存在";
lab.setText(info);
d.setVisible(true); //如果目錄不存在,就顯示對話框
}
//tf.setText(""); //將搜素的內容轉到文本區域後,清空文本框
}
public static void main(String[] args)
{
new MyWindowDemo();
}
}
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo
{
private Frame f; //引用窗體變量
private MenuBar mb; //引用菜單條變量
private Menu m; //引用菜單變量
private MenuItem closeItem,openItem,salveItem; //引用菜單項
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("文件"); //初始化菜單
closeItem=new MenuItem("退出"); //初始化菜單項目
openItem=new MenuItem("打開");
salveItem=new MenuItem("保存");
mb.add(m); //將菜單添加到菜單欄中
m.add(openItem);
m.add(salveItem);
m.add(closeItem); //將關閉按鈕添加到菜單中
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();
}
}
然後具體實例化菜單中的打開和保存操作
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuTest
{
private Frame f; //引用窗體變量
private MenuBar bar; //引用菜單條變量
private TextArea ta;
private Menu fileMenu; //引用菜單變量
private MenuItem closeItem,openItem,saveItem; //引用菜單項
private FileDialog openDia,saveDia; //引用打開和保存對話框
private File file; //引用文件變量
MyMenuTest() //構造函數初始化
{
init();
}
public void init()
{
f=new Frame("my window"); //初始化窗口
f.setBounds(300,100,500,600); //設置窗口的位置和寬高
// f.setLayout(new FlowLayout()); //設置窗體的佈局方式爲流式佈局
bar=new MenuBar(); //初始化菜單欄
ta=new TextArea();
fileMenu=new Menu("文件"); //初始化菜單
closeItem=new MenuItem("退出"); //初始化菜單項目
openItem=new MenuItem("打開");
saveItem=new MenuItem("保存");
bar.add(fileMenu); //將菜單添加到菜單欄中
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem); //將關閉按鈕添加到菜單中
f.setMenuBar(bar); //將菜單欄設置到窗體中
openDia=new FileDialog(f,"打開了",FileDialog.LOAD); //初始化
saveDia=new FileDialog(f,"開始保存",FileDialog.SAVE);
myEvent();
f.add(ta);
f.setVisible(true);
}
private void myEvent()
{
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); //封裝成對象
}
try
{
BufferedWriter bufw=new BufferedWriter(new FileWriter(file)); //創建文件寫入流緩衝區,將文件傳入流中
String text=ta.getText(); //獲取文本區內容
bufw.write(text); //將文本框內容寫出去
bufw.close(); //關閉流
}
catch(IOException ioe)
{
throw new RuntimeException("寫入失敗");
}
}
});
openItem.addActionListener(new ActionListener() //創建打開事件監聽機制
{
public void actionPerformed(ActionEvent e)
{
openDia.setVisible(true); //顯示對話框
String dirPath=openDia.getDirectory(); //獲取文件路徑
String fileName=openDia.getFile(); //獲取文件名
System.out.println(dirPath+"--"+fileName);
if(dirPath==null || fileName==null) //判斷是否爲空
return;
ta.setText(""); //打開新文件之前,清空之前的內容
file=new File(dirPath,fileName); //將文件路徑和文件名封裝成對象
try
{
BufferedReader bufr=new BufferedReader(new FileReader(file));
//創建讀取流緩衝區,將file文件傳入
String line=null;
while((line=bufr.readLine())!=null) //開始讀取數據
{
ta.append(line+"\r\n"); //添加到文本區中
}
bufr.close();
}
catch(IOException ioe)
{
throw new RuntimeException("讀取失敗");
}
}
});
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 MyMenuTest();
}
}
將打開的文件傳到文本區中 在文本區寫些數據,保存到桌面練習:上述文件保存管理操作前提還是在DOS命令行下操作。接下來創建只用雙擊就可以執行的jar包
先在代碼段中用包將其封裝,javac -d .java 將相關的類都打包,裝到一個文件夾中。然後返回包所在的目錄,執行以下命令