一.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);
}
}
}
}