一.GUI
1.名詞解釋
事件: 用戶對組件的一個操作就是一個事件
事件源: 發生事件的組件
監聽器: 添加在事件源上的對象, 這個對象中包含了對事件處理的方法
2.監聽器使用方式
定義類實現XxxListener接口, 實現接口中所有方法. 創建對象, 添加在事件源上.
定義類繼承XxxAdapter, 重寫需要的方法. 創建對象, 添加在事件源上.
Adapter原理:
Adapter是實現了Listener接口的抽象類, 該類中將接口內的所有方法的實現了, 但是方法中沒寫任何代碼.
就是爲了給定義監聽器時提供方便, 只需要重寫必須的方法就可以了.
二.練習
1.簡易Notepad
package cn.base22.gui;
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.Toolkit;
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.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
/*
* 簡易的文本工具
*/
public class MyNotepad {
private Frame frame;
private MenuBar menuBar;
private Menu fileMenu;
private Menu editMenu;
private MenuItem openMenuItem;
private MenuItem saveMenuItem;
private MenuItem exitMenuItem;
private TextArea textArea;
private MyNotepad() {
initUI();
handleEvent();
}
private void initUI() {
frame = new Frame();
frame.setTitle("MyNotepad");
frame.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - 600)/2
, (Toolkit.getDefaultToolkit().getScreenSize().height - 500)/2);
frame.setSize(600, 500);
menuBar = new MenuBar();
fileMenu = new Menu("文件");
editMenu = new Menu("編輯");
openMenuItem = new MenuItem("打開(O) Ctrl+O");
saveMenuItem = new MenuItem("保存(S) Ctrl+S");
exitMenuItem = new MenuItem("退出");
textArea = new TextArea();
frame.setMenuBar(menuBar);
frame.add(textArea);
menuBar.add(fileMenu);
menuBar.add(editMenu);
fileMenu.add(openMenuItem);
fileMenu.add(saveMenuItem);
fileMenu.addSeparator();
fileMenu.add(exitMenuItem);
frame.setVisible(true);
}
private void handleEvent() {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
openMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
open();
}
});
saveMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
save();
}
});
exitMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
textArea.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_O) {
open();
} else if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_S) {
save();
}
}
});
}
private void save() {
FileDialog dialog = new FileDialog(frame, "保存", FileDialog.SAVE);
dialog.setVisible(true); //需注意
String dirPath = dialog.getDirectory();
String fileName = dialog.getFile();
if(dirPath!= null && fileName!= null) { //需注意
File file = new File(dirPath, fileName);
saveFile(file);
}
}
private void saveFile(File file) {
FileWriter fos=null;
try {
fos = new FileWriter(file);
fos.write(textArea.getText());
} catch (IOException e) {
throw new RuntimeException("系統出錯了!-_-");
} finally {
try {
if(fos != null)
fos.close();
} catch (IOException e) {
throw new RuntimeException("系統出錯了!-_-");
}
}
}
private void open() {
FileDialog dialog = new FileDialog(frame, "打開", FileDialog.LOAD);
dialog.setVisible(true); //需注意
String dirPath = dialog.getDirectory();
String fileName = dialog.getFile();
if(dirPath!= null && fileName!= null) { //需注意
File file = new File(dirPath, fileName);
loadFile(file);
}
}
private void loadFile(File file) {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
try {
fis = new FileInputStream(file);
bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len = 0;
while((len=fis.read(b))!=-1) {
bos.write(b, 0, len);
}
String context = bos.toString();
textArea.setText(context);
} catch (FileNotFoundException e) {
throw new RuntimeException("請注意: 文件不存在!");
} catch (IOException e) {
throw new RuntimeException("系統出錯了!-_-");
} finally {
try {
if(fis != null)
fis.close();
} catch (IOException e) {
throw new RuntimeException("系統出錯了!-_-");
}
}
}
public static void main(String[] args) {
new MyNotepad();
}
}
2.文件瀏覽器
package cn.base22.gui;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.Toolkit;
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;
import java.io.IOException;
/*
* 文件瀏覽器
*/
public class MyExplorer {
private Frame frame;
private Panel panel;
private Label label;
private TextField textField;
private Button turnTo;
private Button turnUp;
private List list;
public static void main(String[] args) {
new MyExplorer();
}
private MyExplorer() {
generateUI();
handleEvent();
}
private void generateUI() {
frame = new Frame("MyExplorer");
frame.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-600)/2
,(Toolkit.getDefaultToolkit().getScreenSize().height-500)/2);
frame.setSize(600, 500);
panel = new Panel();
label = new Label("文件路徑爲: ");
textField = new TextField(30);
turnTo = new Button("轉到");
turnUp = new Button("返回");
panel.add(label);
panel.add(textField);
panel.add(turnTo);
panel.add(turnUp);
list = new List();
frame.add(panel, BorderLayout.NORTH);
frame.add(list, BorderLayout.CENTER);
frame.setVisible(true);
}
private void handleEvent() {
frame.addWindowListener(new WindowAdapter() { //關閉窗口
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
turnTo.addActionListener(new ActionListener() { //點擊按鈕打開文件
@Override
public void actionPerformed(ActionEvent e) {
turnTo();
}
});
turnUp.addActionListener(new ActionListener() { //點擊按鈕返回上級目錄
@Override
public void actionPerformed(ActionEvent e) {
turnUp();
}
});
list.addActionListener(new ActionListener() { //鼠標雙擊list的子項打開文件
@Override
public void actionPerformed(ActionEvent e) {
clickList();
}
});
textField.addKeyListener(new KeyAdapter() { //在textField中按回車鍵,打開文件
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER) {
turnTo();
}
}
});
}
protected void turnUp() { //返回上級目錄,若到達根目錄,則不變化
File file = new File(textField.getText());
String parentPath = file.getParent();
if(parentPath != null) {
textField.setText(parentPath);
list.removeAll();
file = new File(parentPath);
String[] files = file.list();
for(String name : files) {
list.add(name);
}
}
}
private void turnTo() { //點擊按鈕打開文件
File file = new File(textField.getText() + File.separator);
listFile(file);
}
protected void clickList() { //鼠標雙擊打開文件
File file = new File(textField.getText(), list.getSelectedItem().toString());
listFile(file);
}
private void listFile(File file) {
if(file.isDirectory()) { //如果是路徑,則清空list,修改textField內容,進行遍歷輸出,添加到list
textField.setText(file.getAbsolutePath());
list.removeAll();
String[] files = file.list();
for(String name : files) {
list.add(name);
}
} else if(file.isFile()) { //如果是文件,則直接打開
try {
Runtime.getRuntime().exec("cmd /c \"" + file.getAbsolutePath() + "\"");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}