------- android培训、java培训、期待与您交流!----------
GUI:
概述:图形用户接口,用图形的方式,来显示计算机操作的界面,这样更方便更直观。
AWT与swing:
AWT(Abstract Window ToolKit): 抽象窗口工具包。
不属于扩展包。
需要调用本地系统方法实现功能。
依赖于本地。
属重量级控件。
swing:javax扩展工具包。
属于扩展包。
在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且
全由Java实现。
增强了移植性。
属轻量级控件。
GUI中全部为组件。
Frame: 是带有标题和边框的顶层窗口
构造方法:
public Frame()throws HeadlessException 不带标题构造,最初不可见的窗口
public Frame(String tilename)throws HeadlessException 带标题构造,最初不可见的窗口
设置窗口的方法:
public void setVisible(boolean b)显示窗口
public void setSize(int width,int height) 以像素为单位设置宽和高
public void setLocation(int x, int y) 设置窗体出现的位置,其实是窗体左上角的位置
public void setTitle(String title) 设置窗口标题
public void setResizable(boolean resizable) 设置窗体大小
代码实现:
package cn.itcast; import java.awt.Frame; public class Demo { public static void main(String[] args) { Frame frame = new Frame("唐嫣的窗口"); frame.setSize(683, 384); frame.setLocation(300, 200); frame.setTitle("林志玲"); frame.setResizable(false); //显示窗口应该放到最后显示,否则窗体设置的过程会被用户看到。 frame.setVisible(true); } }
窗体的进一步设置:
public void setSize(Dimension d) 设置窗体大小
Dimension:类封装单个对象中组件的宽度和高度(精确到整数)。
public Dimension(int width, int height) 给予宽高
public void setLocation(Point p) 设置窗体位置
Point:表示 (x,y) 坐标空间中的位置的点,以整数精度指定
public Point(int x, int y) 给予x值y值
public void setBackground(Color c) 设置背景颜色
Color:颜色 每一种原色都是由0-255描述的。
public Color(int r, int g, int b) 使用三色调出该颜色
r:red红 g:green绿 b:blue蓝
public void setIconImage(Image image) 为窗体设置标题图片
Toolkit:GUI的工具包
public static Toolkit getDefaultToolkit()获取默认工具包。 获取默认的工具包
public abstract Image getImage(String filename) 根据图片文件路径返回一个图片
代码实现:
package cn.itcast; import java.awt.Color; import java.awt.Dimension; import java.awt.Frame; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; public class Demo2 { public static void main(String[] args) { //创建窗体对象 Frame frame = new Frame("唐嫣"); //设置窗体对象 Dimension size = new Dimension(683, 384); frame.setSize(size); Point point = new Point(300, 200); frame.setLocation(point); Color color = new Color(88, 88, 88); frame.setBackground(color); Toolkit tool = Toolkit.getDefaultToolkit(); Image image = tool.getImage("传智纪录片.jpg"); frame.setIconImage(image); //让窗体可见 frame.setVisible(true); } }
设置窗体布局:
public Component add(Component comp) 将组件放入调用方法的容器
public Button(String label)throws HeadlessException 指定按钮标题创建按钮对象
使用默认布局,会将组件直接填充满窗口。所以,如果不想让组件填充需要设置其他的布局方式。
public void setLayout(LayoutManager mgr) 设置窗体的布局
布局分类:
FlowLayout:流式布局
BorderLayout:边界布局
GridLayout:网格布局
GridBagLayout:网格包布局
CardLayout:卡片布局
代码实现:
package cn.itcast; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; public class Demo3 { public static void main(String[] args) { //创建窗体对象 Frame frame = new Frame("唐嫣的窗口"); //设置窗体对象 frame.setSize(683, 384); frame.setLocation(300, 200); frame.setTitle("林志玲"); // FlowLayout fl = new FlowLayout(); // frame.setLayout(fl); //创建一个按钮,将按钮放到窗口中 Button btn = new Button("我是按钮,你看到我了么?!我是最前的"); Button btn2 = new Button("我是按钮,你看到我了么?!"); Button btn3 = new Button("我是按钮,你看到我了么?!"); Button btn4 = new Button("我是按钮,你看到我了么?!"); Button btn5 = new Button("我是按钮,你看到我了么?!我是最后的"); frame.add(btn,BorderLayout.NORTH); frame.add(btn2,BorderLayout.SOUTH); frame.add(btn3,BorderLayout.EAST); frame.add(btn4,BorderLayout.WEST); frame.add(btn5,BorderLayout.CENTER); //让窗体可见 frame.setVisible(true); } }
菜单组件:
public void setMenuBar(MenuBar mb) 设置菜单栏 (菜单条)
MenuBar:放置菜单的菜单条
public Menu add(Menu m) 将菜单放到菜单条上
public Menu(String label) throws HeadlessException 指定菜单名称创建菜单对象
public MenuItem add(MenuItem mi) 向菜单中放入菜单项,获取放菜单
代码实现:
package cn.itcast; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; public class Demo4 { public static void main(String[] args) { //创建窗体对象 Frame frame = new Frame("唐嫣的窗口"); //设置窗体对象 frame.setSize(683, 384); frame.setLocation(300, 200); frame.setTitle("林志玲"); FlowLayout fl = new FlowLayout(); frame.setLayout(fl); //菜单条 MenuBar mb = new MenuBar(); //菜单 Menu menu = new Menu("志玲说"); Menu menu2 = new Menu("志玲夜话"); Menu menu3 = new Menu("志玲说2"); //菜单项 MenuItem mi = new MenuItem("说小时候"); MenuItem mi2 = new MenuItem("说工作"); MenuItem mi3 = new MenuItem("说感情"); menu.add(mi); menu.add(mi2); menu.add(mi3); menu.add(menu3); mb.add(menu); mb.add(menu2); frame.setMenuBar(mb); //让窗体可见 frame.setVisible(true); } }
事件监听机制:
事件源:被监听的组件
事件:具体的用户动作事件
监听器:用来监听事件源
事件处理:处理事件的代码
方法:
public void addWindowListener(WindowListener l) 将窗口与监听器关联。 即让窗口监听器监听窗口。
WindowListener:用于接收窗口事件的侦听器接口。窗体监听器 里边有用户的方法
void windowClosing(WindowEvent e) 用户试图从窗口的系统菜单中关闭窗口时调用。
代码实现:
package cn.itcast; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; public class Demo5 { public static void main(String[] args) { //创建窗体对象 Frame frame = new Frame("唐嫣的窗口"); //设置窗体对象 frame.setSize(683, 384); frame.setLocation(300, 200); frame.setTitle("林志玲"); FlowLayout fl = new FlowLayout(); frame.setLayout(fl); //事件源:frame //监听器:WindowListener的子类对象 //将监听器与事件源窗体关联 frame.addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } //重写事件触发的方法 @Override public void windowClosing(WindowEvent e) { System.out.println("我关了!"); System.exit(0); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } }); //让窗体可见 frame.setVisible(true); } }
监听器适配器与适配器设计模式:
适配器:
当某个接口中方法过多,而又需要创建其子类对象时,可以先定义一个抽象类实现该接口,空实现里边的所有方法。
使用该接口对象时,只需要创建这个子类的匿名内部类对象,重写想要重写的方法即可。‘
不想重写的方法不需要处理。
窗体监听适配器:WindowAdapter
接收窗口事件的抽象适配器类
此类中的方法为空实现,即抽象方法全被重写了,但是方法体内没有内容
方便创建侦听器对象
代码实现:
package cn.itcast; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Demo6 { public static void main(String[] args) { //创建窗体对象 Frame frame = new Frame("明天你还会敲代码么?"); //设置窗体属性 frame.setSize(600, 400); frame.setLocation(400, 200); frame.setLayout(new FlowLayout()); //将监听器与事件源关联 frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println("我关闭了"); System.exit(0); } }); //让窗体可见 frame.setVisible(true); } }
Socket:
相关概述:
计算机网络:
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程:
网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
网络模型:
计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般是指OSI(Open System Interconnection开放系统互连)参考模型和TCP/IP参考模型
网络三要素:
IP地址:网络中设备的标识,不易记忆,可用主机名。
端口号:用于标识进程的逻辑地址,不同进程的标识。
传输协议:通讯的规则,常见协议:TCP,UDP。
InetAddress类:
InetAddress: IP地址
是对IP地址的抽象
无构造方法
主要方法:
public static InetAddress getByName(String host)throws UnknownHostException获取IP地址对象,通常使用IP地址,不使用主机名
public String getHostAddress() 获取主机的IP地址
public String getHostName() 获取主机名
public static InetAddress getLocalHost()throws UnknownHostException获取本地主机
代码实现:
package cn.itcast; import java.net.InetAddress; import java.net.UnknownHostException; public class Demo { public static void main(String[] args) throws UnknownHostException { // InetAddress thisIP = InetAddress.getByName("WIN-3F83E7KV4MG"); // InetAddress thisIP = InetAddress.getByName("192.168.25.182"); InetAddress thisIP = InetAddress.getLocalHost(); String hostName = thisIP.getHostName(); System.out.println(hostName); String hostIP = thisIP.getHostAddress(); System.out.println(hostIP); } }
UDP网络编程操作
DatagramSocket数据套接字与DatagramPacket数据包
完成步骤:
注意:建立发送端,接收端;
创建数据;
建立数据包;
调用Socket的发送接收方法;
关闭Socket;
发送端与接收端是两个独立的运行程序。
用到方法:
建立数据包:
public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
调用Socket的接收方法:
public void receive(DatagramPacket p)接收数据包
调用Socket的发送方法:
public void send(DatagramPacket p)发送数据包
代码实现:
package cn.itcast2; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UDPReceive { public static void main(String[] args) throws IOException { int port = 60000; //发送端指定端口 DatagramSocket ds = new DatagramSocket(port); //创建数据包,用于接收数据 byte[] buf = new byte[1024]; int length = buf.length; DatagramPacket dp = new DatagramPacket(buf, length); //接收数据 ds.receive(dp); //解析 //获取发送端的IP地址对象 InetAddress sendIPObj = dp.getAddress(); //获取发送端的IP地址字符串 String sendIP = sendIPObj.getHostAddress(); //获取数据 int dataLength = dp.getLength(); byte[] data = dp.getData(); String result = new String(data,0,dataLength); System.out.println("收到来自IP"+sendIP+"的数据:"+result); //关闭 ds.close(); } }
package cn.itcast2; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UDPSend { public static void main(String[] args) throws IOException { //发送端不需要指定端口,直接创建空参对象 DatagramSocket ds = new DatagramSocket(); //创建数据 String s = "我爱java"; //创建数据包 byte[] buf = s.getBytes(); int length = buf.length; InetAddress address = InetAddress.getByName("192.168.25.182"); int port = 60000; DatagramPacket dp = new DatagramPacket(buf, length, address, port); //发送数据 ds.send(dp); //关闭 ds.close(); } }
TCP网络编程操作:
Socket客户端和ServerSocket服务器端
完成步骤:
建立客户端和服务器端;
建立连接后,通过Socket中的IO流(Socket流)进行数据的传输;
如果是服务器端,则需要添加一步操作:通过Socket服务获取Sokect再获取其当中的IO流;
关闭socket。
注意:
客户端与服务器端是两个独立的应用程序。
服务器端开启后等待客户端访问,不应关闭。
一个服务器端对应多个客户端。
不同客户端间通信可以通过服务器端中转信息。
代码实现:
package cn.itcast4; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; /* * TCP连接: * 客户端:Socket 服务器端:ServerSocket * * Socket:此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。 * 构造: * public Socket(InetAddress address, int port) 指定要访问的服务器的IP与端口 throws IOException Socket流: public InputStream getInputStream() 获取输入流 throws IOException public OutputStream getOutputStream() 获取输出流 throws IOException TCP协议使用固定的输入输出流完成数据的传输任务。 如果想发送数据,就写出数据 如果想接受数据,就读入数据 */ public class TCPClient { //使用客户端给服务器端发送信息 public static void main(String[] args) throws IOException { //指定IP InetAddress address = InetAddress.getByName("192.168.25.182"); //指定端口 int port = 60000; //创建Socket对象 Socket socket = new Socket(address, port); //创建数据 String data = "网络编程太有意思了!"; //获取输出流 OutputStream outputStream = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(outputStream); BufferedWriter bw = new BufferedWriter(osw); //发送数据 bw.write(data); bw.flush(); // outputStream.write(data.getBytes()); 普通字节流不需要刷新 System.out.println("已经写出了数据"); //关闭 socket.close(); } }
package cn.itcast4; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /* * TCP连接: * 客户端:Socket 服务器端:ServerSocket * * ServerSocket:此类实现服务器套接字 * 构造:public ServerSocket(int port) 指定服务端口,用语客户端访问 throws IOException * * public Socket accept() 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。 throws IOException * * Socket:套接字是两台机器间通信的端点。 * Socket流: public InputStream getInputStream() 获取输入流 throws IOException public OutputStream getOutputStream() 获取输出流 throws IOException TCP协议使用固定的输入输出流完成数据的传输任务。 如果想发送数据,就写出数据 如果想接受数据,就读入数据 */ public class TCPServer { public static void main(String[] args) throws IOException { //创建服务器端,创建ServerSocket对象 int port = 60000; ServerSocket ss = new ServerSocket(port); //通过ServerSocket获取接收的Socket Socket socket = ss.accept(); //获取输出流 InputStream inputStream = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(inputStream); BufferedReader br = new BufferedReader(isr); //获取数据 int c; while((c=br.read())!=-1) { System.out.print((char)c); } System.out.println("已经接收了数据"); //关闭 socket.close(); ss.close(); } }