黑馬程式設計師--Java基礎--awt詳解以及簡單應用
GUI
圖形使用者介面
CLI
命令列使用者介面
Java為GUI提供的物件存在java.Awt和Javax.Swing兩個包中.
Java當中如何完成圖形化介面的製作呢?
AWT:abstract Window ToolKit.需要呼叫本地系統實現功能.屬於重量級控制元件.依賴於平臺.跨平臺性不是特別好.
Javax.Swing:在AWT基礎上.建立一套圖形化系統,提供更多元件,完全由java實現,增強了可移植性,屬於輕量級控制元件.所以以後最好用Swing開發.
還有一個SWT外觀包.
Lable用來封裝文字.CheckBox複選框.TextComponent:文字元件.
Container: 容器,是一個特殊的元件,可以通過add方法來新增其他元件進來.
Window:Frame框架.Dialog:對話方塊.FileDialog:檔案對話方塊就是打負責檔案的選取和儲存的視窗.
容器中的元件的排放方式,就是佈局.
Panel:面板
常見的佈局管理器:
FlowLayout:流式佈局管理器.先放中間.第二次放右邊.預設居中.
從左到右.
Panel預設的佈局管理器
BorderLayout:邊界式佈局
上下左右打麻將.如果不指定方向,那麼會居中直接填滿整個視窗.新增新元件就覆蓋原元件.
GridLayout:網格式佈局
每個元件都存放在格子當中,計算器就是一個GridLayout.
GridBagLayout:網格包佈局管理器.
CardLayout:卡片式佈局:
建立圖形化介面:
1. 建立Frame窗體
2. 對窗體進行基本設定,比如大小位置和佈局
3. 定義元件
4. 將元件通過窗體的add()新增到窗體中
5. 讓窗體顯示,通過setVisible(true);方法
事件監聽機制:
1. 事件源:圖形介面元件.
2. 事件:Event.每一個事件源都有自己的特有的對應事件和共性事件.
3. 監聽器:可以觸發某一個事件的動作都已經封裝到了監聽器中,
以上三者在Java中都定義好了,直接獲取其物件就可以了.我們要做的事情就是對產生的動作進行處理.
新增監聽器:f.add(WindowListener wl)
WindowListener的一個抽象子類 WindowAdapter,已經實現了介面,覆蓋了其中所有方法,只要繼承WindowAdapter覆蓋自己需要的方法即可!
一般開發awt要匯入兩個包: java.awt.*;java.awt.event.*;
要讓按鈕具備退出的功能,那麼按鈕就是事件源,新增一個監聽器.ActionListener是少數沒有Adapter類的其中一個.因為它裡面只有一個方法,直接實現即可.ActionPerfored(ActionEvent ae);
滑鼠事件和鍵盤事件:
AddKeyListener
AddMouseListener
此時點選按鈕誰會先執行?
滑鼠動作先.
下面我們來動手做一些圖形化介面:
例項1
package guiDemos;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event .WindowAdapter;
import java.awt.event.WindowEvent;
public class AwtDemo1 {
public static void main(String[] args) {
Frame f = new Frame("my awt");
f.setLayout(new FlowLayout());
f.setVisible(true);
f.setSize(300,200);
f.setLocation(700, 400);
Button b = new Button("我是一個按鈕");//定義一個按鈕,名稱為"我是一個按鈕"
f.add(b);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.out.println("我關!");
System.exit(0); //點選右上角關閉按鈕,退出虛擬機器
}
public void windowActivated(WindowEvent e1){
System.out.println("activated"); //每次視窗被啟用,列印"activated"
}
public void windowOpened(WindowEvent e2){
System.out.println("我活啦!"); //每次開啟視窗,會輸出"我活啦"
}
});
System.out.println("hello world!");
}
}
class myWindow extends WindowAdapter{
public void windowClosing(WindowEvent e) {
System.out.println("window closing");
e.getWindow();
System.out.println(e.toString());
System.out.println(e.getWindow());
System.out.println(e.getSource());
System.exit(0);
}
}
例項2
package guiDemos;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo {
public static void main(String[] args) {
// TODO 自動生成的方法存根
new Frame_Demo();
}
}
class Frame_Demo {
private Frame f;
private Button but;
Frame_Demo() {
init();
}
public void init() {
f = new Frame("myFrame");
f.setBounds(1000, 500, 300, 400);
f.setLayout(new FlowLayout());
but = new Button("Run");
myEvent();
f.add(but);
f.setVisible(true);
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自動生成的方法存根
System.out.println("button do");
System.exit(0);
}
});
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void windowOpened(WindowEvent e) {
System.out.println("活了");
}
});
}
}
點選按鈕,打印出
例項3
package guiDemos;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
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 MouseKeyEventDemo {
public static void main(String[] args) {
// TODO 自動生成的方法存根
new mouseAndKey();
}
}
class mouseAndKey {
private Frame f;
private Button but;
private TextField tf;
mouseAndKey() {
init();
}
public void init() {
f = new Frame("myFrame");
f.setBounds(1000, 500, 300, 400);
f.setLayout(new FlowLayout());
but = new Button("Run");
tf = new TextField(20);
myEvent();
f.add(tf);
f.add(but);
f.setVisible(true);
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+"is illegal");
e.consume();
}
}
});
/*
* but.addActionListener(new ActionListener() {
*
* @Override public void actionPerformed(ActionEvent e) { // TODO
* 自動生成的方法存根 System.out.println("button do"); System.exit(0); } });
*/
but.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
System.out.println("entered");
}
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2)
System.out.println("雙擊動作");
}
});
but.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (KeyEvent.getKeyText(e.getKeyCode()).equals("Q") && e.isControlDown())
System.exit(0);
System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + "..." + e.getKeyChar());
System.out.println("CTRL+Q");
}
});
}
private void myEvent() {
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void windowOpened(WindowEvent e) {
System.out.println("活了");
}
});
}
}
例項4
package guiDemos;
import java.awt.FileDialog;
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.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class MyMenuDemo {
private Frame frame;
private MenuBar bar;
private Menu fileMenu, subMenu;
private MenuItem closeItem, openItem, saveItem;
private FileDialog openDlg, saveDlg;
private TextArea ta;
MyMenuDemo() {
init();
}
public void init() {
frame = new Frame("my Window");
bar = new MenuBar();
fileMenu = new Menu("檔案");
openItem = new MenuItem("開啟");
saveItem = new MenuItem("儲存");
closeItem = new MenuItem("退出");
ta = new TextArea();
openDlg = new FileDialog(frame, "開啟檔案", FileDialog.LOAD);
saveDlg = new FileDialog(frame, "儲存檔案", FileDialog.SAVE);
frame.add(ta);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
bar.add(fileMenu);
frame.setMenuBar(bar);
frame.setBounds(700, 300, 600, 500);
frame.setVisible(true);
closeItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自動生成的方法存根
System.exit(0);
}
});
openItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自動生成的方法存根
openDlg.setVisible(true);
String fileName = openDlg.getDirectory() + openDlg.getFile();
if (openDlg.getFile() != null) {
File f = new File(fileName);
// File fileName = new File(openDlg.getFile());
// ta.append(f.toString());
ta.setText("");
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(f));
String line = null;
while ((line = br.readLine()) != null) {
ta.append(line + "\r\n");
}
} catch (IOException e1) {
// TODO 自動生成的 catch 塊
e1.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e1) {
// TODO 自動生成的 catch 塊
e1.printStackTrace();
}
}
}
}
});
saveItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自動生成的方法存根
saveDlg.setVisible(true);
BufferedWriter bw = null;
String fileName = saveDlg.getDirectory()+saveDlg.getFile();
if(saveDlg.getFile()!=null)
{
try {
bw = new BufferedWriter(new FileWriter(fileName));
String text = ta.getText();
bw.write(text);
} catch (IOException e1) {
// TODO 自動生成的 catch 塊
e1.printStackTrace();
}finally{
try {
if(bw!=null)
bw.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
});
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
// TODO 自動生成的方法存根
new MyMenuDemo();
}
}
選擇檔案後,文字區中顯示文字內內容,相當於一個windows小工具記事本
例項5
寫一個程式,用於遍歷並資料夾中的所有內容
package guiDemos;
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 frame;
private TextField tf;
private Button but;
private TextArea ta;
private Dialog dlg;
private Label lbl;
private Button butOK;
MyWindowDemo() {
init();
}
public void init() {
frame = new Frame("my Window");
frame.setBounds(900, 400, 400, 500);
frame.setLayout(new FlowLayout());
tf = new TextField(30);
but = new Button("轉到");
ta = new TextArea(20, 40);
frame.add(tf);
frame.add(but);
frame.add(ta);
ta.setEditable(false);
frame.setVisible(true);
myEvent();
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
if(KeyEvent.getKeyText(e.getKeyCode())=="Enter")
doFile();
}
});
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doFile();
}
});
}
private void doFile(){
ta.setText("");
File f = new File(tf.getText());
if (!f.exists()) {
// ta.setText("請重新輸入地址");
dlg = new Dialog(frame, "輸入錯誤",false);
lbl = new Label("\""+f.toString()+"\""+"不是一個有效路徑");
butOK = new Button("確定");
dlg.setLayout(new FlowLayout());
dlg.setBounds(900, 500, 300, 160);
dlg.add(lbl);
dlg.add(butOK);
dlg.setVisible(true);
dlg.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
dlg.setVisible(false);
}
});
butOK.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自動生成的方法存根
dlg.setVisible(false);
}
});
} else
fileList(f);
}
private void fileList(File f) {
// TODO 自動生成的方法存根
File[] files = f.listFiles();
for (File file : files) {
ta.append(file.toString());
ta.append("\r\n");
}
/*
* for (File file : files) { if (!file.isHidden()) { if
* (file.isDirectory()) { ta.append(file.toString()); ta.append("\r\n");
* fileList(file); } else { ta.append(file.toString());
* ta.append("\r\n"); // System.out.println(f); } } }
*/
}
private void myEvent() {
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
// TODO 自動生成的方法存根
new MyWindowDemo();
}
}
以上就是Java awt介面的api基本使用.