黑马程序员_GUI 建立窗体,事件处理,分类

 

---------------------- android培训java培训、期待与您交流! ----------------------

 

,建立窗体

 体中可以存放各种组件,所以窗体是容器Container。创建时我们使用的是它的子类 
Container的常用子类有两个,WindowPanelWindow是我们常用的窗体,Panel是用来布局的不可见的。 
Window也有两个常用子类,FrameDialogFrame是我们常用的带有标题和边框的顶层窗口,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 
 IPv44个字节组成,40-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。   
 IPv68组,每组416进制数。 
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();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值