GUI
1、GUI基本概况
Graphical User Interface的缩写,图形化用户界面
Java为GUI提供的对象都存在java.awt,javax.swing两个包中
awt依赖于本地系统平台,如颜色样式显示,swing跨平台
组件与容器
组件 Component,是GUI图形界面的组成单元。
容器Container,可以存放组件,也可以存放容器。
2、布局管理
FlowLayout(流式布局管理器):从左到右的顺序排列。
BorderLayout(边界布局管理器):东,南,西,北,中
GridLayout(网格布局管理器):规则的矩阵
CardLayout(卡片布局管理器):选项卡
GridBagLayout(网格包布局管理器):非规则的矩阵
3、建立一个窗体
窗体中可以存放各种组件,所以窗体是容器Container。创建时我们使用的是它的子类
Container的常用子类有两个,Window和Panel。Window是我们常用的窗体,Panel是用来布局的不可见的。
Window也有两个常用子类,Frame和Dialog。Frame是我们常用的带有标题和边框的顶层窗口,Dialog是对话框。
所有AWT包中的类都会运行在AWT线程上
4、事件处理
事件处理机制
事件:用户对组件的一个操作。
事件源:发生事件的组件。
监听器:我们需要处理某个事件,就需要在发生事件的组件上添加监听器,也就是java.awt.event包中XxxListener接口的子类。
事件处理器:监听器中的方法。监听器被添加在组件上之后,组件上发生了对应事件就会执行指定方法。
常用事件分类
窗体事件,WindowEvent,窗体打开、关闭、正在关闭、激活、最小化等。
鼠标事件,MouseEvent,鼠标按下、抬起、进入、移出等。
键盘事件,KeyEvent,键盘按下、抬起等。
动作事件,ActionEvent,在某一组件上发生了定义好的动作,例如按钮上鼠标点击或按空格,菜单上鼠标点击或按回车等。
5、GUI的练习:建立一个鼠标监听事件
public class mouse
{
private Frame f;
private Button but;
private TextField tf;
mouse()
{
init();
}
public void init()
{
f=new Frame("苗苗 ,I LOVE U");
f.setBounds(800,300,400,200);
f.setLayout(new FlowLayout());
tf=new TextField(25);
but=new Button("退出");
f.add(tf);
f.add(but);
myevent();
f.setVisible(true);
}
private void myevent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.out.println("关闭");
System.exit(0);
}
});
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
int codecount=1;
int code=e.getKeyCode();
if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9))
{
System.out.println("非法字符"+codecount++);
e.consume();
}
}
});
but.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ESCAPE ^e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
System.exit(0);
System.out.println(e.getKeyText(e.getKeyCode())+"..."+e.getKeyCode());
}
});
/*df
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("退出,按钮干的");
System.exit(0);
}
});
*/
but.addActionListener(new ActionListener()
{
private int clickCount2=1;
public void actionPerformed(ActionEvent e)
{
System.out.println("action ok"+"..."+clickCount2++);
}
});
but.addMouseListener(new MouseAdapter()
{
private int count=1;
private int clickCount=1;
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入"+count++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
System.out.println("你是疯子"+clickCount++);
}
});
}
protected int code() {
// TODO Auto-generated method stub
return 0;
}
public static void main(String[] args)
{
new mouse();
}
}
二、Socket网络编程
1、网络编程概念
IP地址
每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
ipconfig:查看本机IP
ping:测试连接
本地回路地址:127.0.0.1
端口号
每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
端口号范围从0-65535
编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
网络协议
为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
UDP
面向无连接,数据不安全,速度快。不区分客户端与服务端。
TCP
面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
Socket
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
2、UDP传输
发送
步骤:
创建DatagramSocket
创建DatagramPacket
使用DatagramSocket发送DatagramPacket
关闭DatagramSocket
接收
步骤:
创建DatagramSocket
创建DatagramPacket
使用DatagramSocket接收DatagramPacket
关闭DatagramSocket
3、TCP传输
客户端
步骤:
创建Socket连接服务端
调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的管道流
输入流可以读取服务端输出流写出的数据
输出流可以写出数据到服务端的输入流
服务端
步骤:
创建ServerSocket
调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的管道流
输入流可以读取客户端输出流写出的数据
输出流可以写出数据到客户端的输入流
4、练习
//写一个聊天程序
package wangluo;
public class chatsend
{
private DatagramSocket ds
public chatsend(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)
{
if("886".equals(line));
break;
byte[] buf=line.getBytes();
DatagramPacket dp= new DatagramPacket(buf,buf.length,InetAddress.getByName("123.223.156.211"),10003);
}
}
catch(Exception e)
{
throw new RuntimeException("发送端失败");
}
}
}