---------------------- android培训、java培训、期待与您交流! ----------------------
一,建立窗体
体中可以存放各种组件,所以窗体是容器Container。创建时我们使用的是它的子类
Container的常用子类有两个,Window和Panel。Window是我们常用的窗体,Panel是用来布局的不可见的。
Window也有两个常用子类,Frame和Dialog。Frame是我们常用的带有标题和边框的顶层窗口,Dialog是对话框。
所有AWT包中的类都会运行在AWT线程上
二.事件处理
1.什么是事件
用户的一个操作就是一个事件, 发生事件的组件叫做事件源
2.处理事件
如果想在事件发生的时候执行一段代码, 就要对事件进行处理
3.监听器
添加到事件源上的一个对象, 当事件发生了, 虚拟机会自动调用监听器中的方法
定义类实现XxxListener, 重写抽象方法, 创建对象添加到事件源, 事件源发生事件就执行指定方法.
4.适配器
定义类实现XxxListener需要将其中所有方法全部重写, 有时我们并不需要所有方法, 这样做比较麻烦.
可以定义类继承WindowAdapter, WindowAdapter中将所有方法已经重写了, 只要再重写需要的方法即可.
常用事件分类:
用事件分类
Ÿ 窗体事件,WindowEvent,窗体打开、关闭、正在关闭、激活、最小化等。
Ÿ 鼠标事件,MouseEvent,鼠标按下、抬起、进入、移出等。
Ÿ 键盘事件,KeyEvent,键盘按下、抬起等。
Ÿ 动作事件,ActionEvent,在某一组件上发生了定义好的动作,例如按钮上鼠标点击或按空格,菜单上鼠标点击或按回车等
做一个Notepad记事本:
package cn.itcast.day23.exercise;
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.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.FileOutputStream;
import java.io.IOException;
@SuppressWarnings("serial")
public class Notepad extends Frame {
private MenuItem openMenuItem;
private TextArea textArea;
private MenuItem saveMenuItem;
private MenuItem exitMenuItem;
public Notepad() {
generateUI(); // 生成界面
handleEvent(); // 处理事件
}
public Notepad(String path) {
this();
loadFile(new File(path));
}
private void save() {
// 打开对话框
FileDialog dialog = new FileDialog(this, "保存", FileDialog.SAVE);
dialog.setVisible(true);
// 获取对话框中选中的文件
String dir = dialog.getDirectory();
String name = dialog.getFile();
if (dir != null && name != null)
saveFile(new File(dir, name));
}
private void saveFile(File file) {
try {
// 获取TextArea中文本, 写出到file
String content = textArea.getText();
FileOutputStream fos = new FileOutputStream(file);
fos.write(content.getBytes());
fos.close();
setTitle(file.getName() + " - 记事本");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private void open() {
// 显示一个对话框
FileDialog dialog = new FileDialog(this, "打开", FileDialog.LOAD);
dialog.setVisible(true);
// 获取选中的文件
String dir = dialog.getDirectory();
String name = dialog.getFile();
if (dir != null && name != null)
loadFile(new File(dir, name));
}
private void loadFile(File file) {
try {
// 读取file中内容
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1)
baos.write(buffer, 0, len);
fis.close();
baos.close();
// 将文件内容显示到文本域, 改变标题
String content = new String(baos.toByteArray());
textArea.setText(content);
setTitle(file.getName() + " - 记事本");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e); // 如果出了IOException, 抛出一个RuntimeException
}
}
private void handleEvent() {
addWindowListener(new WindowAdapter() { // 给窗体添加窗体监听器
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
openMenuItem.addActionListener(new ActionListener() { // 给打开菜单项添加动作监听器
public void actionPerformed(ActionEvent e) {
open();
}
});
saveMenuItem.addActionListener(new ActionListener() { // 给保存菜单项添加动作监听器
public void actionPerformed(ActionEvent e) {
save();
}
});
exitMenuItem.addActionListener(new ActionListener() { // 给退出菜单项添加动作监听器
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
textArea.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_O && e.isControlDown())
open();
if (e.getKeyCode() == KeyEvent.VK_S && e.isControlDown())
save();
}
});
}
private void generateUI() {
// 创建窗体, 设置大小, 设置位置
setTitle("无标题 - 记事本");
setSize(600, 400);
setLocation(500, 100);
// 创建菜单栏
MenuBar menuBar = new MenuBar();
// 创建菜单
Menu fileMenu = new Menu("文件");
Menu editMenu = new Menu("编辑");
// 创建菜单项
openMenuItem = new MenuItem("打开");
saveMenuItem = new MenuItem("保存");
exitMenuItem = new MenuItem("退出");
MenuItem cutMenuItem = new MenuItem("剪切");
MenuItem copyMenuItem = new MenuItem("复制");
MenuItem pasteMenuItem = new MenuItem("粘贴");
MenuItem deleteMenuItem = new MenuItem("删除");
// 把菜单项装入菜单
fileMenu.add(openMenuItem);
fileMenu.add(saveMenuItem);
fileMenu.addSeparator();
fileMenu.add(exitMenuItem);
editMenu.add(cutMenuItem);
editMenu.add(copyMenuItem);
editMenu.add(pasteMenuItem);
editMenu.add(deleteMenuItem);
// 把菜单装入菜单栏
menuBar.add(fileMenu);
menuBar.add(editMenu);
// 把菜单栏装入窗体
setMenuBar(menuBar);
// 创建文本域, 添加到窗体
textArea = new TextArea();
add(textArea);
// 显示窗体
setVisible(true);
}
}
网络编程概念
IP地址
每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
ipconfig:查看本机IP
ping:测试连接
本地回路地址:127.0.0.1
IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。
IPv6:8组,每组4个16进制数。
1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
1a2b::aaaa:0000:0000:0000:aabb:1f2f
1a2b:0000:aaaa::aabb:1f2f
1a2b:0000:aaaa::0000:aabb:1f2f
1a2b:0000:aaaa:0000::aabb:1f2f
端口号
Ÿ 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要
明确发到哪个程序。
Ÿ 端口号范围从0-65535
Ÿ 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被
系统程序占用了。
网络协议
为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
Ÿ UDP
面向无连接,数据不安全,速度快。不区分客户端与服务端。
Ÿ TCP
面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
一个发送端与接收端合并的类:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Chat {
public static void main(String[] args) throws Exception {
SenderThread senderThread = new SenderThread();
ReceiverThread receiverThread = new ReceiverThread();
receiverThread.setDaemon(true);
senderThread.start();
receiverThread.start();
}
}
class SenderThread extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = br.readLine();
if ("quit".equals(line))
break;
byte[] data = line.getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("255.255.255.255"), 6789);
socket.send(packet);
}
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class ReceiverThread extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(6789);
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while (true) {
socket.receive(packet);
byte[] data = packet.getData(); // DatagramPacket中的字节数组
int len = packet.getLength(); // 发送端发送的数据长度
String content = new String(data, 0, len); // 将接收到的数据解码成字符串
String ip = packet.getAddress().getHostAddress(); // 获取地址
int port = packet.getPort(); // 获取端口号
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()) + " " + ip + ":" + port + " " + content); // 打印数据
}
} catch (Exception e) {
e.printStackTrace();
}
}
}