




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于DV算法的路由器设计与实现实验报告学姓日院:名:期:一.实验目的1 .深入理解分布式路由选择算法,以最简单的DV算法来增强对路由算法的认识2 .理解、掌握和利用距离向量算法3 .所实现的品&由器模拟Internet上的IP路由器。它能确定网络的最短路由, 并在这些利用上传输分组2 .DV算法描述距离矢量算法,也称为 Bellman-Ford shortest path algorithm ,每个路由器都 定期或拓扑结构突发变化时与其相邻的所有路由器交换路由表, 据此更新它们自 己的路由表。DV算法工作方式:每个路由器维护一张路由表,表中分为三个表项:目的 地址,列出了当前可达的目的
2、网络地址;到达目的地址下一跳,列出了下一跳的IP地址;到达目的地址的代价,以距离或跳数为表征。路由表更新规则:1 .发现了一条到达某目的的新路由,而该路由在原来的路由表中不存在(即 发现了一条新路由),则在路由表中增加该路由。2 .发现了一条到达某目的的、距离更短的新路由,则用该路由替换原有的 路由。3 .到达某目的的一条路由,其后继结点到达该目的地的距离发生了变化, 则需要更新该路由的距离。在此实验当中,为了实现和模拟的方便,刚开始初始化生成一个网络连接图 的二维数组(见 mainManager/RoutersInit.java,初始化 的二维数组是 entity/NetMap.java);
3、每个路由器类包括了路由器 ID,端口,routerTable对象,还 有两个HashMap个存储为每一个相邻路由器的计时器,一个存储每一个相邻 路由器的上一次交流时间);路由表采用了两个数组来实现,一个数组存储到各个 网络的下一跳,一个数组存储到各个网络的跳数,如下结构,以路由器一为例,(路由表的默认数组和两个真是数组的显示信息, 其中下一跳是0表示不可达的 下一跳,不是0如2004表示下一跳是2004,在距离数组里,如果是16表示不 可达,如果是0,表示到本身路由,不是0或16表示可达且跳数为该数值),如 下图路由表左边方框中的信息 所示:在路由表中,只登记下一跳而不是完整路由,以真实模拟路
4、由器的DV算法 处理。转发分组时,严格按照路由表进行转发。如上图,路由器的连接信息在上 面图片的左部区域,右部区域分为两部分(一个是路由器接到相邻路由器发来的 路由表的实时 我设置的是每1秒更新一次 信息,一个是发送或者转发 数据的显示信息)。3 .实验要求1 .输出路由表:在此实验当中为了实现方便,所有拓扑结构中的路由器都 给以显示(可达的,不可达的16以及自己的路由编号):public class NetMap (public int ) ( getlnitlnt&metbiap () intinitvecter=new int' (0,1,16,16,1,16),1,0,
5、1,1,16, (lr16rlf0,lrlr 也应工/仇0,©, (16,16rLf16f0return initVecter; ) )要求对这个连接图的二维数组解析,进行DV算法的模拟。2 .发送分组:每个数字代表一个数据分组发送请求;数据分组发送到数字 代表的目的地;如果目的结点不是邻居结点,不能直接发送分组,而必须在路由 的各个结点上沿路由转发该分组。收到数据分组的结点必须输出一行,显示该分组的目的,在图1中的右上角显示了每一秒的路由表的更新情况,每一个路由器都有三个转发进程,发送进程和接收进程。发送进程每一秒都需要发送自己的路 由表信息。每一个路由器都给自己相邻的路由器设置了
6、一个计时器,如果 10秒 钟没有收到相邻路由器的信息,就将下一跳设置成0,距离设置成16(表示不可 达)。否则重新开始计数。2 .发送数据:数据分组必须有数据,且在如图 1中的点击提交按钮之前,必 须在文本框中输入正确的数据格式(传送的目的路由和要传送的数据之间必须要 有“#”号分割),如:2003#DDDDDDD ,表示目的路由是2003,传送的数据是DDDDDDD 0例如:路由器2006要向2001发送数据,则具体转发过程如下: Hops规定的时间或步数内到达目的结点,否则丢弃之。分组经过每个中间结点 时,将其TTL减1。若TTL=1 ,丢弃,否则继续转发。上第击舞200<CiVM送
7、噢取1=1回|福彳当第由器2W4Ai嬴最11=1S3请输目的路由磁据】:如之0。3平”提交清皤旧聃臃由领据上 和2口旧回AA提交灰不是该略由涔痛由去信点二目的路由二多下路由转发和郭艳转发的信息;收到了 2M4的略由襄2001 2002. 2003 2004 2。三.2我£取初一?的潞虫表"FiS:2004. 20 D4. 2004. 2004 2004, 0距离是:4, 3,2, 1.3r 0J收到了或。嗨由表3QQ4BW由聂以k是该路由翡籍出羌信息:映下招由转发和徽降发的信息;III选搽是否使读略由发生故障我最接的目的是2。01我要废发这个数据包给笈口 4 要传送的数据是
8、3转发笑毕-目的路由;2001, 20 D2. 2003, 2004. 2005, 20 0t下一跳是:2003, 2003.2003, 0, 2003. 2呻是晓是:之 1,0, 2,1箔由支行由袅7观寸的路由麦了卫。口珀辘由麦版到了 2叩弓佶向2Ml的敕据 曲技是人此心龊.朝要转发这个赖据包给刖 转发完毕HIJ?|=|选悍是否使读潞由发生肺呻:开始施睥.国都由器之(XBRV尊法娱的路由器200上。帽法眼请输I目的骼由啕据):如2。并如提交请输I目的路由喘报】:如2G0环,小以下是读腌由落露由衷信息:以下陶由转发和也用转发的信息以下是读潞由器3&由去信息目辘由:boot 2002.
9、2003. 2004. 20Q5. 200E不一跳是:i|2005, 2002. 0, 2004, 2005. 2004距离是:12,1,0, 1, 1,2)收到了刘口三的珞由青 监到了砥Q而勺潞由杏 收到了演皿的蹈由表 收到TFQ 口 5的塔由走收到了 £口口4倍向2001的凝据 数据是:AA-AM我要转发这个数据包给2Q05 转发完毕。I卜目的路由:2001,2002, 2003 2QQ4 2005, 200(卞T由2005, 2502. 0, 2MM, 2005 2004口酸是:2.1,0 1.12提交瞑下潞由转发和敕语转发的信息投到了我口4传向20。珀燧娃g 栽据是:岫MA2
10、.也要转发这个数据包给2。昨 转发我毕。* I = M达释是否使诙瑞由发生故障;二开始检眸-III选择是否使该耨由发生故障:开始椀障凸路由器200LDV苣出槎旭以下是该路由器籍由来信息:目的路由:2001. 2002. 2003. 2004. 2005. 2划卜一跳是:0. 2002. 2002, 2002, 2D05, 2006距鹿是:0, 1. 2, 3, 1, 4提交叹下路由转哀和如据转发的信息;IJJ20 .J 了?的星 里I 72002(由表 处的跖由柬属性,分收到了2。0第向2001的物据 蓟据是总他用W 弱就是目的地中组应该在选择是否使股籍由本生命蹿;开蜡蒯障“3 .关于时间定时
11、:每个路由器每1秒钟发出它们的路由表;每个路由器根 据收到的路由表更新它们自己的路由表;路由器必须具备检测邻居是否活动的能 力,如果路由器在10秒钟没有收到邻居发来的更新,则认为邻居不可达。4 .显示活动的相邻路由:用一个特定的表格来显示与当前路由相邻的路由 器的信息。5 .关于拓扑结构:路由器必须具备路由器故障和恢复的能力;这里假设链 路不会出现故障,分组不会丢失和出错;如果路由器在给定时间内未运行, 表示 路由器故障,如果重启运行,则认为路由器故障恢复;当然,假设通信是双向的。四.实验用例编程语言:java;开发环境:jdk1.6.0_02、Myeclipse8.6,测试用例为二维数组的维
12、数个(你可以随便写出一个对称的二维数组, 程序 可以自己解析的,我用的都是活代码),如下如所示我写的一个拓扑图的二维数 组,如图:0,1,16,16,1,16, lf0f1,16,16,16), 16,1,0,1,1,16, 16,16,1,0,16,1, 1,应1,16/0,16),16,16,16,1,16,0此实验是模仿DV算法,应用java中的多线程来模拟多个路由器,并且实现 路由器之间的路由表和数据的传送。实验中路由表的数据结构相比真实的 DV算 法发生了变化,所以程序在实现过程当中尽量的按照实验所用的路由表结构来完 成功能,但是这不影响其主要思想的实现。1 .拓扑结构:为了模拟路由
13、表的更新,首先是先确立六个结点网络的拓扑结构, 由于是应 用多线程来模拟各个路由器,所以在实验过程当中可以随时挂起某个或多个路由 器来模拟网络拓扑的变化,之后仍然可以恢复挂起的路由器。网络的初始拓扑结 构如图2所示:端口号:5001端口号:5002端口号:5003端口号:5004图2此处,路由表的端口号和路由器号全是来自 entity/Constant.java文件的整个 程序的全局变量,路由器初始值为 2001,而端口初始值为5001,分别是数组初 始化时的维数个。在实验实现过程当中,通过路由器线程的挂起实现网络拓扑结构的动态变 化,之后会对相应的更该重新画出拓扑结构。2 .路由表初始化:在
14、程序的mainManager/RoutersInit.java类中初始化了留个路由器,这六个路 由器的每一个实现都是在 mainManager/RouterThread.java类中,。以上图2的初 始化二维数组中所规划的网络拓扑结构为标准,根据当前所创建的路由器编号静 态初始化每个路由器自己的路由表。3 .数据格式:各个路由器实例之间通过 UDP来交换路由表,路由器之间还需要进行数据 的传输。在此,需要定义所传输的路由表和数据的结构,我是全部打成了数据包或者路由表包,具体结构见 transportPacket/RouterTablePacket.java(有 sourceRouterId和
15、routerTable 两个属性),transportPacket/SendDataPacket.java有 sourceRouterId,destRouterId,byte口data,hops=16 四 个 属 性), transportPacket/TotalPacket.java有 type,routerTablePacket,sendDataPackeE个属 性,TotalPacket类定义了具体具体是传输的包是什么类型的)三个类,如果是传 输路由 表就用 RouterTablePacket把路由表包装后再用 TotalPacket的 sendRouterTable类型来包装,最后用U
16、DP发送出去,如果是传输数据就用SendDataPacketlffi要传送的数据包装后再用 TotalPacket的sendData类型来包装, 最后用UDP发送出去,在目的路由器端对收到的数据进行解封装。五.程序描述为完成所要求功能,程序首先实现了二维数组维数个路由器线程,每一个路由器线程下面又实现了发送线程、接收线程和转发数据线程三个子线程;接收线 程下面实现了定时器子线程。建立一个工程,命名为day12-02_DV_new_hasTimer (名字可以随便起,我是以前的习惯都加上了日期),在此工程下建立源程序文 件,每个线程放在单独的java源程序文件当中。该实验还可以对其中一个路由器进
17、行挂起,别的路由器在10秒后如果收不到这个路由器发来的路由表信息,就将其路由表中的与其对应的相应路由表的值 进行修改成不可达,逐渐通知到整个网络。在这里有点不同于 DV算法的是: DV算法是每个路由器为收到的路由表的每一个简历一个计时器,而该路由器简 化了这个设计,是仅仅为相邻的路由器保留一个计时器, 这样不仅可以大大减少 整个网络的通信量,将计时器的信息保留在内存而不是在路由表中, 而且采用了 hashMap保存后在验证是否联通时,从 hashMap中取数据方便快捷。 六、实验结论在实验过程遇到了许多问题,一方面是编程语言的使用,另一方面是对路由 算法的理解程度。三是计时器的用法,尤其是计时
18、器的用法想了将近2个小时,最后通过不懈的调试与算法完善,程序基本实现所要求的功能,有能力模拟DV算法。DV算法的优缺点:DV算法简单,容易实现,对于好消息传播的速度快,但 是对于坏消息则传播速度慢。package entity;/*常量类author郭金磊since 20131220*/public class Constant /* return返回品&由Id的初试值*/public static int getRouterIdBasic() return 2001;/* return返回路由端口的初试值*/public static int getPortBasic() retur
19、n 5001;package entity;/* 初始化的网络拓扑图* author享B金磊*since 20131220* /public class NetMap /* return返回初始化的网络图*/public int叩 getInitInternetMap() int口 initVecter=new int口0,1,16,16,1,16, 1,0,1,16,16,16, 16,1,0,1,1,16, 16,16,1,0,16,1, 1,16,1,16,0,16, 16,16,16,1,16,0 ;return initVecter;package entity;import jav
20、a.util.HashMap;/* 路由器实体类, 包含 routerId , port , RouterTable , createTimerMapsForNeighbers lastTimeMapsauthor郭金磊 since 20131220*/public class Router /*产生全局唯一的序列化的实体ID*/private static final long serialVersionUID = -4112736218089137504L;/*路由ID*/private int routerId;/*路由端口*/private int port;/*路由表*/privat
21、e RouterTable RouterTable;/*存储计时器的Map*/private HashMap<Integer,TimeCounter> createTimerMapsForNeighbers=new HashMap<Integer,TimeCounter>();/*存储上一次该路由器收到某个路由器的路由表时间*/private HashMap<Integer,Long> lastTimeMaps=new HashMap<Integer,Long>();/* 默认的构造方法*/public Router() super();)/*
22、有参数routerId和port的构造方法* /public Router(int routerId, int port) super();this.routerId = routerId;this.port = port;)/*有参数routerld和port和routerTable的构造方法*/public Router(int routerld, int port, RouterTable routerTable) super();this.routerId = routerId;this.port = port;RouterTable = routerTable;)/*getters
23、和 setters方法return相应的属性值*/public int getRouterId() return routerId;)/* getters 和 setters方法*/public void setRouterId(int routerId) this.routerId = routerId;)/*getters 和 setters方法return相应的属性值*/public int getPort() return port;)/* getters 和 setters方法* /public void setPort(int port) this.port = port;)/*g
24、etters 和 setters方法return相应的属性值*/public RouterTable getRouterTable() return RouterTable;/*getters 和 setters方法return相应的属性值*/public void setRouterTable(RouterTable routerTable) RouterTable = routerTable;/*getters 和 setters方法return相应的属性值*/public HashMap<Integer, TimeCounter> getCreateTimerMapsForN
25、eighbers() return createTimerMapsForNeighbers;/*getters 和 setters方法return相应的属性值*/public void setCreateTimerMapsForNeighbers(HashMap<Integer, TimeCounter> createTimerMapsForNeighbers) this.createTimerMapsForNeighbers = createTimerMapsForNeighbers;/*getters 和 setters方法return相应的属性值*/public HashMa
26、p<Integer, Long> getLastTimeMaps() return lastTimeMaps;/*getters 和 setters方法return相应的属性值*/public void setLastTimeMaps(HashMap<Integer, Long> lastTimeMaps) this.lastTimeMaps = lastTimeMaps;)/* tostring 方法* /Overridepublic String toString() return "Router routerId=" + routerId +
27、", port=" + port + ", RouterTable=" + RouterTable + ""package entity;import java.io.Serializable;import java.util.Arrays;/*路由表实体类author郭金磊 since 20131220*/public class RouterTable implements Serializable /* 产生全局唯一的序列化的实体ID*/private static final long serialVersionUID = 7
28、320514855714982331L;/* 为每一个路由器设置一个下一跳的数组*/private int nextHop;/* 为每一个路由器设置一个距离的数组*/private int distance;/*有参数routerld和port的构造方法*/public int getDistance() return distance;/* getters 和 setters方法* return相应的属性值* /public void setDistance(int distance) this.distance = distance;/* getters 和 setters方法* retu
29、rn相应的属性值* /public int getNextHop() return nextHop;/* getters 和 setters方法* return相应的属性值* /public void setNextHop(int nextHop) this.nextHop = nextHop;/* tostring 方法*/Overridepublic String toString() return "RouterTable distance=" + Arrays.toString(distance)+ ", nextHop=" + Arrays.t
30、oString(nextHop) + ""package entity;import java.util.Timer;import java.util.TimerTask;/*计时器类,用于判断是否路由器的联通author郭金磊since 20131220*/public class TimeCounter /*得到邻居白各由器ID*/private int sourceRouterId;/*得到本身路由器*/private Router router;/*每个这个类一个计时器*/private Timer timer=new Timer();/*getters 和 set
31、ters方法return相应的属性值*/public int getSourceRouterId() return sourceRouterId;* getters 和 setters方法* return相应的属性值* /public void setSourceRouterId(int sourceRouterld) this.sourceRouterld = sourceRouterId;/* getters 和 setters方法* return相应的属性值* /public Router getRouter() return router;/* getters 和 setters方法*
32、 return相应的属性值* /public void setRouter(Router router) this.router = router;/* 默认的构造方法* /public TimeCounter() super();/* 带参数的构造方法* param sourceRouterId 邻居的路由器 ID* param router得到本身路由器,可以得到本身路由器的很多信息* /public TimeCounter(int sourceRouterId, Router router) super();this.sourceRouterId = sourceRouterId;thi
33、s.router = router;)/* 开启计时器* /public void start() final long lastTime=router.getLastTimeMaps().get(sourceRouterId);timer.schedule(new TimerTask() Overridepublic void run() if(lastTime=router.getLastTimeMaps().get(sourceRouterId)for(int i=0;i<new NetMap().getInitInternetMap().length;i+)if(router.g
34、etRouterTable().getNextHop()i=sourceRouterId) router.getRouterTable().getDistance()i=16; router.getRouterTable().getNextHop()i=0;)else timer.cancel();, 10 * 1000);/* 关闭该计时器*/public void close() timer.cancel();package main;import java.awt.BorderLayout;import java.awt.Color;import javax.swing.JFrame;i
35、mport javax.swing.JTextArea;import mainManager.RouterThread;import mainManager.RoutersInit;import entity.NetMap;import entity.Router;/*主进入界面,进入程序的主控制接口author郭金磊since 20131220*/public class RoutersStart extends JFrame/*产生全局唯一的序列化的实体ID*/private static final long serialVersionUID = -4212024082944256452
36、L;/*建立一个全局的JTextArea用来关闭时窗口是,关闭整个进程而不是线程*/private JTextArea router_MainArea;/*初始化多少个路由器*/public RoutersStart()super("router_MainProcess");router_MainArea=new JTextArea();getContentPane().add(router_MainArea,BorderLayout.CENTER);router_MainArea.append("nnn开 始 模 拟+newNetMap().getIMtInte
37、rnetMap().length+"个路由器的距离向量路由算法.”);setBounds(150,150,500,400);router_MainArea.setBackground(Color.lightGray);setBackground(Color.DARK_GRAY);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);int length=new NetMap().getInitInternetMap().length;Router routers=new RoutersInit().getIni
38、tRouters();for(int i=0;i<length;i+)new Thread(new RouterThread(routersi).start();/* 主程序的入口* param args默认的参数,此处不用参数* /public static void main(String口 args) new RoutersStart();package mainManager;import entity.Constant;import entity.NetMap;import entity.Router;import entity.RouterTable;/*读取拓扑图的二维数组
39、数据,来初始化二维数组维数个路由器线程* author享B金磊*since 20131220*/public class RoutersInit /* 初始化路由器数组* return得到初始化的几个路由器* /public Router getInitRouters() int initNetMap=new NetMap().getInitInternetMap();Router routers=new RouterinitNetMap.length;RouterTable routerTables=new RouterTableinitNetMap.length;for(int i=0;i
40、<initNetMap.length;i+)routersi=newRouter(Constant.getRouterIdBasic()+i,Constant.getPortBasic()+i);routerTablesi=new RouterTable();routerTablesi.setDistance(initNetMapi);int nextHop=new intinitNetMap.length;for(int j=0;j<initNetMap.length;j+)if(initNetMapij=1)nextHopj=Constant.getRouterIdBasic(
41、)+j;elsenextHopj=0;routerTablesi.setNextHop(nextHop);routersi.setRouterTable(routerTablesi);System.out.println(routersi);return routers;package mainManager;import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.HeadlessException;import java.awt.event.ActionEven
42、t;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;imp
43、ort .UnknownHostException;import java.util.Arrays;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import totalThreads.Forwar
44、dThread;import totalThreads.ReceiveThread;import totalThreads.SendThread;import transportPacket.SendDataPacket;import transportPacket.TotalPacket;import entity.Constant;import entity.NetMap;import entity.Router;import entity.RouterTable;/*每一个路由器都有的路由器线程author郭金磊since 20131220*/public class RouterThr
45、ead extends JFrame implements Runnable /* 产生全局唯一的序列化的实体ID*/private static final long serialVersionUID = -9094445007188117205L;/* 每一个路由器线程一个路由器实体*/private Router router;/* 每一个路由器实体一个接受路由表线程*/private DatagramSocket receiveSocket =null;/* 每一个路由器实体一个接受转发的数据线程*/private DatagramSocket receiveDataSocket =n
46、ull;/* 每个路由器线程一个接受线程*/private ReceiveThread receiveThread=null;/*每个路由器线程一个发送线程*/private SendThread sendThread=null;/*每个路由器线程一个转发线程*/private ForwardThread forwardThread=null;/*每个路由器线程一个主窗口*/private JFrame routerFrame;/*有三个显示路由器信息的JTextArea, 一个路由表,一个路由表的更新信 息,一个是发送数据的显示信息*/private JTextArea routerArea
47、Left,routerAreaRightNorth,routerAreaRightSouth; / 构造路由器窗口的组件。/*提示信息三个请输(目的路由#数据),该路由器路由表信息,路由转发和 数据转发的信息*/private JLabel commandPrompt,showMsgLink,showMsgForward;/*选择是否挂起该路由的提示*/private JLabel suspended;/*写出要达到的目的地和要发送的数据*/private JTextField enterField;/*提交数据*/private JButton submit;/*选择是否挂起该路由*/pri
48、vate JCheckBox selectSuspend;/*是否挂起该路由的内置变量布尔值*/public boolean suspendFlag = false;/*显示几个panal用于承载所有的组件。*/ secondLine,centerArea,centerAreaLeft,centerAreaRight,centerAreaRightBorderCente r;privateJPanelfirstLine,/*默认的构造方法*/public RouterThread() super();/*进行本路由器注入的构造方法param router每个路由器进程要注入的路由器(注入又叫控
49、制反转)*/public RouterThread(Router router) try this.router = router;routerFrame = new JFrame("路由器"+router.getRouterId()+"_DV 算法 模拟郭金磊2620139012");commandPrompt = new JLabel("青输(目的路由 #数据):"); suspended = new JLabel(选择是否使该路由发生挂起:"); enterField = new JTextField('如 2
50、003#AAA",100);submit=new JButton("提交");submit.setSize(20,10);selectSuspend = new JCheckBox肝始挂起.");firstLine = new JPanel();secondLine = new JPanel();centerArea = new JPanel();centerAreaLeft = new JPanel();centerAreaRight = new JPanel();centerAreaRightBorderCenter = new JPanel();f
51、irstLine.setLayout(new GridLayout(1,2);secondLine.setLayout(new GridLayout(1,2);centerArea.setLayout(new GridLayout(1,2);centerAreaLeft.setLayout(new BorderLayout();centerAreaRight.setLayout(new BorderLayout();centerAreaRightBorderCenter.setLayout(new GridLayout(2,1);firstLine.add(commandPrompt);fir
52、stLine.add(enterField);firstLine.add(submit);secondLine.add(suspended);secondLine.add(selectSuspend);enterField.setCaretPosition(enterField.getText().length();showMsgLink = new JLabel("以下是该路由器路由表信息:");/"以下 路由显示转发的信息:”showMsgLink.setOpaque(true);showMsgLink.setBackground(Color.pink);sh
53、owMsgForward = new JLabel("以下路由转发和数据转发的信息:");showMsgForward.setOpaque(true);showMsgForward.setBackground(Color.pink);routerAreaLeft=new JTextArea();routerAreaRightNorth=new JTextArea();routerAreaRightSouth=new JTextArea();routerAreaLeft.setBackground(Color.YELLOW);routerAreaRightNorth.setB
54、ackground(Color.GREEN);routerAreaRightSouth.setBackground(Color.WHITE);JScrollPane scrollPaneLeft=new JScrollPane(routerAreaLeft);JScrollPanescrollPaneRightNorth=newJScrollPane(routerAreaRightNorth);JScrollPanescrollPaneRightSouth=newJScrollPane(routerAreaRightSouth);centerAreaLeft.add(showMsgLink,BorderLayout.NORTH);centerAreaLeft.add(scrollPaneLeft,BorderLayout.CENTER);centerAreaRight.add(showMsgForward,Bord
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业生涯与农作物种子繁育员考试重要性试题答案
- 游泳救生员紧急救护知识试题及答案
- 足球裁判员应具备的道德观试题及答案
- 家庭隔音改造服务合同(2篇)
- 农作物繁育员常识问答试题及答案
- 2024年游泳救生员理论考试的试题及答案
- 2025年中国分离式无损伤轴承多用卸轴器市场调查研究报告
- 2024年考试大纲农业植保员试题及答案
- 2025年中国光学眼镜片成品市场调查研究报告
- 农作物种子繁育员考试所需的理论知识及试题答案
- 2024年甘肃白银希望职业技术学院招聘笔试真题
- 中小学五一节前安全教育班会课件
- 电销主管管理培训
- 房地产市场报告 -2025年一季度厦门写字楼和零售市场报告
- 【MOOC】研究生英语科技论文写作-北京科技大学 中国大学慕课MOOC答案
- 2024年辅警招聘考试试题库含完整答案(各地真题)
- 《工程建设标准强制性条文电力工程部分2023年版》
- 骨龄及其测评方法
- 全国挑战杯科技作品竞赛标书范例
- 勘察设计工作流程图
- 劳动用工管理指导意见
评论
0/150
提交评论