黑马程序员——Java GUI和网络编程

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

 


GUI图形用户界面

 Java.Awt:Abstract Windows Toolkit(抽象窗口工具包),需要调用本地系统方法实现功能属于重量级控件。

 Javax.Swing:在Awt的基础上,建立一套图形界面系统其中提供了更多的组件,而且完全由java实现。增强了移植性,属于与轻量级控件。

 容器中的组件排放方式,就是布局。

 常见的布局管理器:

1、FlowLayout 流式布局
API中说明:
流布局一般用来安排面板中的按钮。它使得按钮呈水平放置,直到同一条线上再也没有适合的按钮。线的对齐方式由 align 属性确定。可能的值为:
LEFT
RIGHT
CENTER
LEADING
TRAILING
import java.awt.*;
import java.applet.Applet; 
public class myButtons extends Applet {
    Button button1, button2, button3; 
    public void init() { 
       button1 = new Button("Ok");     
       button2 = new Button("Open");
       button3 = new Button("Close"); 
       add(button1);              
       add(button2); 
       add(button3); 
      } 
 } 

2、BorderLayout边框式布局
API说明:
这是一个布置容器的边框布局,它可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:北、南、东、西、中。每个区域最多只能包含一个组件,并通过相应的常量进行标识:NORTH、SOUTH、EAST、WEST、CENTER。当使用边框布局将一个组件添加到容器中时,要使用这五个常量之一,例如:
Panel p = new Panel(); p.setLayout(new BorderLayout()); p.add(new Button("Okay"), BorderLayout.SOUTH);
为了方便起见,BorderLayout 将缺少字符串说明的情况解释为常量 CENTER:
Panel p2 = new Panel(); p2.setLayout(new BorderLayout()); p2.add(new TextArea()); // Same as p.add(new TextArea(), BorderLayout.CENTER);
此外,BorderLayout 支持相对定位常量 PAGE_START、PAGE_END、LINE_START 和 LINE_END。在ComponentOrientation 设置为 ComponentOrientation.LEFT_TO_RIGHT 的容器中,这些常量分别映射到NORTH、SOUTH、WEST 和 EAST。
3、GridLayout网格布局
API说明:
GridLayout类是一个布局处理器,它以矩形网格形式对容器的组件进行布置。容器被分成大小相等的矩形,一个矩形中放置一个组件。例如,下面是一个将六个按钮布置到三行两列中的applet:
import java.awt.*; 
import java.applet.Applet; 
public class ButtonGrid extends Applet { 
   public void init() { 
        setLayout(new GridLayout(3,2));
        add(new Button("1")); 
        add(new Button("2")); 
        add(new Button("3")); 
        add(new Button("4")); 
        add(new Button("5")); 
        add(new Button("6")); 
   } 
 } 
4、CardLayout卡片布局
API说明:
CardLayout 对象是容器的布局管理器。它将容器中的每个组件看作一张卡片。一次只能看到一张卡片,容器则充当卡片的堆栈。当容器第一次显示时,第一个添加到CardLayout 对象的组件为可见组件。
卡片的顺序由组件对象本身在容器内部的顺序决定。CardLayout 定义了一组方法,这些方法允许应用程序按顺序地浏览这些卡片,或者显示指定的卡片。addLayoutComponent(java.awt.Component, java.lang.Object) 方法可用于将一个字符串标识符与给定卡片关联,以便进行快速随机访问。


 创建图形化界面的步骤:

                      1:创建frame窗体。

                      2:对窗体进行基本设置,比如大小,位置,布局。

                      3:定义组件

                      4:将组件通过窗体的add方法添加到窗体中。

                      5:让窗体显示通过setVisible(true).

class FrameDemo  
{  
     private Frame f;  
     private Button but;  
     Frame()  
     {  
          init();  
     }  
     public void init()  
     {  
          f=new Frame("my frame");  
          //初始化窗体参数  
          but= new Button("my button");l  
          f.add(but);  
          f.setVisible(true);  
          myEvent();  
          //显示窗体  
          private void myEvent()  
          {  
f.addWindowListener(new WindowAdapter(){  
     public void windowClosing(WindowEvent e)  
     {  
          System.out.println("按下关闭时执行的动作");  
     }  
     public void windowActivated(WindowEvent e)  
     {  
          System.out.println("窗口活动时执行的动作");  
     }  
     public void windowOpened(WindowEvent e)  
     {  
          System.out.println("当窗口打开时执行的动作");  
     }  
});  
                    but.addActionListener(new ActionListener()  
                    {  
                         public void actionPerformed(ActionEvent e)  
                         {  
                              System.out.println("触发按钮执行的动作");  
                         }  
                    })  
                    but.addMouseListener(new MouseAdapter(){  
                         public void mouseClicked(MouseEvent e)  
                         {  
                              if(e.getClickCount()==2)  
                                   System.out.println("双击");  
                         }       
                    })  
                    but.addKeyListener(new KeyAdapter()  
                    {  
                         public void keyPressed(KeyEvent e)  
                         {  
                              if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)  
                                   按下回车键执行的代码;  
                         }  
                    })  
          }  
            
     }  
}  

事件监听机制的特点:

                                    1:事件源就是Awt包或Swing包中的那些图形界面的组件。

                                    2:事件:每一个事件源都有自己的特有对应事件和共性事件。

                                    3:监听器:将可以触发某一事件的动作都已经封装到了监听器中。

              以上三者,在Java中都已经定义好了,直接获取对象来用就可以了。我们要做的事情就是对产生的动作进行处理。

  组件里面不能直接写文本必须要用lable封装成对象添加进去。


网络编程

  数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。为了方便称呼这个数字,叫做端口。
   
 定义通讯规则:这个通讯规则叫做协议,国际组织定义了通用的协议TCP\IP

 UDP
 1:将数据及源和目的封装成数据包中,不需要建立连接。
 2:每个数据包的大小限制在64k以内。
 3:因无连接,是不可靠协议。
 4:不需要建立连接速度快。

TCP

1:建立连接,形成数据传输通道。
2:在连接中进行大数据传输。
3:通过三次握手完成连接是可靠协议。
4:必须建立连接,效率会低。

Socket(插座)

 相当于港口,Socket就是为网络服务提供的一种机制。通信俩端都有socket。
 
 网络通信其实就是socket间的通信。

 数据在两个socket间通过io传输。

UDP传输
 
 DatagramSocket与DatagramPacket
 
 建立发送端和接收端。建立数据包。调用Socket的发送接受方法。关闭Socket。发送端和接收端是两个独立运行的程序。

  需求:通过UDP传输方式,将一段文字数据发送出去。

 1:建立Udpstocket服务。
 2:提供数据,并将数据封装到数据包中。
 3:通过socket服务的发送功能,将数据包发出。
 4:关闭资源。
 import java.net.*;
import java.io.*;
class Udpsend2 
{
public static void main(String[] args) throws Exception


{
DatagramSocket ds = new DatagramSocket();//建立udpsocket端口


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("192.168.1.102"),10001);
ds.send(dp);//发送
}
ds.close();

}
}
class Udprece2 
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(10001);//建立udpsocket端口,端口要一致。


while(true)
{
byte[] buf = new byte[1024];


DatagramPacket dp = new DatagramPacket(buf,buf.length);//封装成数据包 


ds.receive(dp);//接收数据


String ip = dp.getAddress().getHostAddress();//获取ip
String data = new String(dp.getData(),0,dp.getLength());//获取数据
System.out.println(ip+"::"+data);


}
}
}
TCP分客户端和服务端
客户端对应的对象是Socket
服务端对应的对象是Serversocket


客户端:

步骤:
1.创建Socket服务并指定要连接主机的地址和端口
2.获得Socket流中的输出流,将数据写到该流中,通过网络发送给服务端
3.获取Socket流中的输入流,将服务端反馈的数据获取到,并打印到控制台
4.关闭客户端资源

//创建客户端的socket服务,指定目的主机和端口
Socket s = new Socket("192.168.1.103",10000);
为了发送数据,应该获得都socket流的输出流
OutputStream out = s.getOutputStream();
out.write("tcp.ge men lai le".getBytes());
s.close();


服务端:

1.建立服务端的Socket服务,ServerSocket();
并监听一个端口
2.获取连接的客户端对象
通过ServerSocket的accept方法。没有连接就等,这个方法是阻塞式的。
3.客户端发过来数据,那么服务端就要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据,并打印在控制台上。
4.关闭客户端

//建立服务端的Socket服务,并监听一个端口
ServerSocket ss = new ServerSocket(10000);
//通过ServerSocket的accept方法获取连接的客户端对象
Socket s = ss.accept();
//获得客户端发送的数据,要使用客户端对象的读取流来读取数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
//关闭客户端
s.close();
代码示例
import java.awt.*;  
class  AwtDemo  
{  
     public static void main(String[] args)  
     {  
          Frame f = new Frame("my awt");  
          f.setSize(500,100);  
          f.setLocation(300,200);  
          f.setLayout(new FlowLayout());  
  
          Button b = new Button("按钮");  
          f.add(b);  
  
          f.setVisible(true);//使不可见的窗体可见  
  
          System.out.println("Hello World!");  
     }  
}  


在客户端与服务端的通信交互时,如果用的是字符流的缓冲区,记得写入之后要flush(),
readLine的结束符是"\r\n";
客户端的Socket.close()是将socket流中加-1,使服务端的readLine方法停下,导致循环结束
PrintWriter的用的写入方法是println()


客户端上传文本文件时,客户端的readLine所在循环可以自动结束,服务端不可以,需要加入标记结束循环,标记可以是时间戳,也可以在末尾直接加"-1";
shutdownOutput();可以关客户端的输出流,在流中加入结束标记-1

浏览器作为客户端时,服务端的输出流要在结束时加-1,并且要记得刷新流

URL统一资源定位符
URL url = new URL("");

String getFile()
     获取URL的文件名//带参数
String getHost()
     获取URL的主机名
String getPath()
     获取URL的路径部分
String getPort()
     获取URL的端口号
String getProtocol()
     获取URL的协议名称
String getQuery()
     获取URL的查询部


URLConnection conn = url.openConnection();

InputStream in = coon.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String s = new String(buf,0,len);


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

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值