java串口通信程序(程序及注释)-13页word资料
- 格式:doc
- 大小:24.00 KB
- 文档页数:13
java读写串⼝数据你了解多少⽬录1.导⼊⽀持java串⼝通信的jar包:2.编写代码操作串⼝:总结最近接触到了串⼝及其读写,在此记录java进⾏串⼝读写的过程。
1.导⼊⽀持java串⼝通信的jar包:在maven项⽬的pom.xml中添加RXTXcomm的依赖或者下载RXTXcomm.jar并导⼊到项⽬中。
⽀持Java串⼝通信操作的jar包,m⽐较⽼,⽽且不⽀持64位系统,推荐使⽤Rxtx这个jar包(32位/64位均⽀持)。
下载地址:注意:运⾏过程中抛出ng.UnsatisfiedLinkError错误或gnu.io下的类找不到时,将rxtx解压包中的rxtxParallel.dll,rxtxSerial.dll 这两个⽂件复制到C:\Windows\System32 ⽬录下可解决该错误。
2.编写代码操作串⼝:串⼝必要参数类:包含连接串⼝所必须的参数,⽅便在调⽤串⼝时设置和传递串⼝参数/*** 串⼝必要参数接收类* @author: LinWenLi* @date: 2018年7⽉21⽇下午4:30:40*/public class ParamConfig {private String serialNumber;// 串⼝号private int baudRate; // 波特率private int checkoutBit; // 校验位private int dataBit; // 数据位private int stopBit; // 停⽌位public ParamConfig() {}/*** 构造⽅法* @param serialNumber 串⼝号* @param baudRate 波特率* @param checkoutBit 校验位* @param dataBit 数据位* @param stopBit 停⽌位*/public ParamConfig(String serialNumber, int baudRate, int checkoutBit, int dataBit, int stopBit) {this.serialNumber = serialNumber;this.baudRate = baudRate;this.checkoutBit = checkoutBit;this.dataBit = dataBit;this.stopBit = stopBit;}getter()...setter()...}串⼝操作类:(其中包含的CustomException是⾃定义异常类,仅⽤于抛出异常原因。
通过comm.jar等配置如果用applet应用程序的话,下面这个函数是可以取到串口的,但是如果通过web应用程序(或者通过jsp调用)却取不到串口,而且也不会抛出异常,感觉很奇怪,特来请教!CommPortIdentifier.getPortIdentifiers();同时目标机器的java运行环境也需要把w32comm.dll, comm.jar xxx.proper等放到相应的目录就是用ibm的包而不用sun的comm包:ibm-javacomm-win32-x86.zip只需要把comm驱动包这个类的装载更新一下即/serialcomm.htm利用Java实现串口全双工通讯一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系统发送来的查询和控制信息,并将执行结果或查询结果发送回主控系统。
本文介绍了一个简单的通过串口实现全双工通讯的Java类库,该类库大大的简化了对串口进行操作的过程。
本类库主要包括:SerialBean.java (与其他应用程序的接口), SerialBuffer.java(用来保存从串口所接收数据的缓冲区), ReadSerial.java (从串口读取数据的程序)。
另外本类库还提供了一个例程SerialExample.java 作为示范。
在下面的内容中将逐一对这几个部分进行详细介绍。
1. SerialBeanSerialBean是本类库与其他应用程序的接口。
该类库中定义了SerialBean的构造方法以及初始化串口,从串口读取数据,往串口写入数据以及关闭串口的函数。
具体介绍如下:本函数构造一个指向特定串口的SerialBean,该串口由参数PortID所指定。
PortID = 1 表示COM1,PortID = 2 表示COM2,由此类推。
本函数初始化所指定的串口并返回初始化结果。
如果初始化成功返回1,否则返回-1。
java调用coms端口串口通信的方法。
首先需要下到串口驱动。
javacomm20-win32.zip去sun的主页应该有下的。
在这个驱动中有comm.jar,m.properties,win32com.dll这么3个重要的文件。
1、首先配置驱动,把m.properties,win32com.dll拷贝到你的jdk 中具体位置为C:\Program Files\Java\jdk1.6.0_06\bin然后配置windows系统环境变量,在path中加入C:\ProgramFiles\Java\jdk1.6.0_06\bin;打开你的java工程,配置user library,并导入comm.jar包。
2、现在就可以开始写代码了。
串口读写代码如下CommPortIdentifier portID =CommPortIdentifier.getPortIdentifier(com);//1,先拿到Identifier//其中com是String类型的,传入的是串口名com="COM1";SerialPort port = (SerialPort)portID.open("MyComm", 100000000);//2,打开串口//"MyComm"是串口名,100000000是串口过期时间(ms)。
port.setSerialPortParams(rate, databits,stopbit, parity);//3,设置串口属性//rate 波特率(默认9600),databits载波位(默认8),stopbit停止位(默认1),parity校验位(默认0无校验)port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);//4(可选)设置数据流控制模式,默认为无port.close();//关闭串口3、串口读入写出流。
Java串口通信详解序言说到开源,恐怕很少有人不挑大指称赞。
学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱……,总之是皆大欢喜。
然而开源软件或类库的首要缺点就是大多缺乏详细的说明文档和使用的例子,或者就是软件代码随便你用,就是文档,例子和后期服务收钱。
这也难怪,毕竟就像某个著名NBA 球员说的那样:“我还要养家,所以千万美元以下的合同别找我谈,否则我宁可待业”。
是啊,支持开源的人也要养家,收点钱也不过分。
要想既不花钱又学到知识就只能借助网络和了,我只是想抛砖引玉,为开源事业做出点微薄共献,能为你的工程解决哪怕一个小问题,也就足够了。
虽然我的这个系列介绍的东西不是什么Web框架,也不是什么开源服务器,但是我相信,作为一个程序员,什么样的问题都会遇到。
有时候越是简单的问题反而越棘手;越是小的地方就越是找不到称手的家伙。
只要你不是整天只与“架构”、“构件”、“框架”打交道的话,相信我所说的东西你一定会用到。
1串口通信简介1.1常见的Java串口包1.2串口包的安装(Windows下)2串口API概览mPortmPortIdentifierm.SerialPort2.4串口API实例2.4.1列举出本机所有可用串口2.4.2串口参数的配置2.4.3串口的读写3串口通信的通用模式及其问题3.1事件监听模型3.2串口读数据的线程模型3.3第三种方法4结束语1串口通信简介嵌入式系统或传感器网络的很多应用和测试都需要通过PC机与嵌入式设备或传感器节点进行通信。
其中,最常用的接口就是RS-232串口和并口(鉴于USB接口的复杂性以及不需要很大的数据传输量,USB接口用在这里还是显得过于奢侈,况且目前除了SUN有一个支持USB 的包之外,我还没有看到其他直接支持USB的Java类库)。
SUN的CommAPI分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。
java 串口通信案例Java串口通信是指使用Java编程语言实现与串口设备之间的数据通信。
串口通信在很多应用场景中都有广泛的应用,比如物联网、工业自动化、智能家居等领域。
本文将列举十个以Java串口通信为题的案例,介绍其实现方法和应用场景。
1. 串口读取数据通过Java编程语言实现串口读取数据的功能,可以使用Java的串口通信库,如RXTX、JavaComm等。
首先需要打开串口,并设置串口参数,然后通过监听串口数据的方式实时读取串口传入的数据。
这个案例适用于需要实时监控串口设备数据的应用场景,比如环境监测。
2. 串口发送数据通过Java编程语言实现串口发送数据的功能,可以使用Java的串口通信库。
首先需要打开串口,并设置串口参数,然后通过写入数据的方式将数据发送到串口设备。
这个案例适用于需要向串口设备发送指令或数据的应用场景,比如控制外部设备。
3. 串口数据解析通过Java编程语言实现串口数据解析的功能,可以将从串口读取的原始数据进行解析,提取出有用的信息。
可以根据数据格式进行解析,比如按照特定的协议解析数据。
这个案例适用于需要对串口设备传输的数据进行处理和分析的应用场景。
4. 串口数据存储通过Java编程语言实现串口数据存储的功能,可以将从串口读取的数据保存到本地文件或数据库中。
可以根据需求选择适当的存储方式,比如文本文件、二进制文件或数据库。
这个案例适用于需要对串口设备传输的数据进行长期存储和分析的应用场景。
5. 串口数据转发通过Java编程语言实现串口数据转发的功能,可以将从一个串口读取的数据转发到另一个串口。
可以实现串口设备之间的数据交互,比如串口设备之间的数据通信或设备之间的数据同步。
这个案例适用于需要多个串口设备之间进行数据交互的应用场景。
6. 串口数据监控通过Java编程语言实现串口数据监控的功能,可以监控串口设备的状态和传输数据。
可以实时显示串口设备的连接状态、波特率、数据位、停止位等信息,并实时显示串口传输的数据。
通过comm.jar等配置如果用applet应用程序的话,下面这个函数是可以取到串口的,但是如果通过web应用程序(或者通过jsp调用)却取不到串口,而且也不会抛出异常,感觉很奇怪,特来请教!CommPortIdentifier.getPortIdentifiers();同时目标机器的java运行环境也需要把w32comm.dll, comm.jar xxx.proper等放到相应的目录就是用ibm的包而不用sun的comm包:ibm-javacomm-win32-x86.zip只需要把comm驱动包这个类的装载更新一下即/serialcomm.htm利用Java实现串口全双工通讯一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系统发送来的查询和控制信息,并将执行结果或查询结果发送回主控系统。
本文介绍了一个简单的通过串口实现全双工通讯的Java类库,该类库大大的简化了对串口进行操作的过程。
本类库主要包括:SerialBean.java (与其他应用程序的接口), SerialBuffer.java(用来保存从串口所接收数据的缓冲区), ReadSerial.java (从串口读取数据的程序)。
另外本类库还提供了一个例程SerialExample.java 作为示范。
在下面的内容中将逐一对这几个部分进行详细介绍。
1. SerialBeanSerialBean是本类库与其他应用程序的接口。
该类库中定义了SerialBean的构造方法以及初始化串口,从串口读取数据,往串口写入数据以及关闭串口的函数。
具体介绍如下:本函数构造一个指向特定串口的SerialBean,该串口由参数PortID所指定。
PortID = 1 表示COM1,PortID = 2 表示COM2,由此类推。
本函数初始化所指定的串口并返回初始化结果。
如果初始化成功返回1,否则返回-1。
串口通信原理及操作流程串口通信是一种通过串行连接来传输数据的通信方式。
相对于并行通信而言,串口通信只需要一条数据线来传输数据,因此更节省空间和成本。
串口通信常用于计算机与外设之间的数据传输,如打印机、调制解调器、传感器等。
串口通信的原理主要是通过发送和接收数据的方式来实现通信。
在串口通信中,发送方将要传输的数据按照一定的协议进行封装,然后逐位地通过数据线发送给接收方。
接收方在接收到数据后,根据协议进行解封,得到传输的数据。
串口通信的操作流程如下:1.配置串口参数:在进行串口通信之前,需要先对串口进行初始化和配置。
配置包括波特率、数据位、停止位、奇偶校验等。
波特率表示每秒钟传输的位数,不同设备之间的串口通信需要保持一致。
2.打开串口:打开串口可以通过编程语言的串口操作函数来实现。
打开串口时,应该确保该串口没有被其他程序占用。
3.发送数据:发送数据时,需要将待发送的数据封装成符合协议要求的数据包。
一般情况下,数据包开头会有起始符和目标地址、源地址等标识信息,以便接收方识别数据包。
4.接收数据:接收数据时,需要通过串口接收缓冲区来获取接收到的数据。
一般情况下,接收方会设置一个数据接收完成的标志位,用于通知上层应用程序接收到了数据。
5.解析数据:接收到的数据包需要进行解析,以获取有效的数据。
解析的方式根据协议的不同而不同,可以是根据提前约定的规则进行解析,或者是根据协议中的标志位进行解析。
6.处理数据:经过解析后得到的数据可以进行相应的处理。
处理的方式根据具体的应用场景来确定,例如将数据显示在界面上、存储到文件中等。
7.关闭串口:通信结束后,需要关闭串口以释放相关资源,并防止其他应用程序对串口的访问。
需要注意的是,串口通信的可靠性和稳定性对于一些实时性要求较高的应用来说是非常重要的。
在进行串口通信时,应该合理选择合适的串口参数,确保数据的正确传输和解析。
此外,在编程时应该进行异常处理,防止因异常情况导致的数据丢失或通信中断。
串⼝通信概念通信(Serial Communications)的概念⾮常简单,串⼝按位(bit)发送和接收。
与串⾏通信相对的是并⾏通信。
数据传输⼀般都是以字节传输的,⼀个字节8个位。
拿⼀个并⾏通信举例来说,也就是会有8根线,每⼀根线代表⼀个位。
⼀次传输就可以传⼀个字节,⽽串⼝通信,就是传数据只有⼀根线传输,⼀次只能传⼀个位,要传⼀个字节就需要传8次。
就像⼩虎队那⾸歌⼀样,把你的⼼,我的⼼,串⼀串,再烤⼀烤。
串⼝通信就是把数据串在⼀根线上传输,所以就叫串⼝吧。
通信⽅式⼀般情况下,设备之间的通信⽅式可以分成并⾏通信和串⾏通信两种。
它们的区别是:串⾏通信分类1、按照数据传送⽅向分为:单⼯:数据传输只⽀持数据在⼀个⽅向上传输;半双⼯:允许数据在两个⽅向上传输。
但是,在某⼀时刻,只允许数据在⼀个⽅向上传输,它实际上是⼀种切换⽅向的单⼯通信;它不需要独⽴的接收端和发送端,两者可以合并⼀起使⽤⼀个端⼝。
全双⼯:允许数据同时在两个⽅向上传输。
因此,全双⼯通信是两个单⼯通信⽅式的结合,需要独⽴的接收端和发送端。
2、按照通信⽅式分为:同步通信:带时钟同步信号传输。
⽐如:SPI,IIC通信接⼝。
异步通信:不带时钟同步信号。
⽐如:UART(通⽤异步收发器),单总线。
异步通信的两个关键:第⼀,数据单元——帧,它是双⽅约定好的数据格式;第⼆,波特率,它决定了‘帧’⾥每⼀位的时间长度。
异步通信的特点:不要求收发双⽅时钟的严格⼀致,实现容易,设备开销较⼩,但每个字符要附加2~3位⽤于起⽌位,各帧之间还有间隔,因此传输效率不⾼。
在同步通讯中,收发设备上⽅会使⽤⼀根信号线传输信号,在时钟信号的驱动下双⽅进⾏协调,同步数据。
例如,通讯中通常双⽅会统⼀规定在时钟信号的上升沿或者下降沿对数据线进⾏采样。
在异步通讯中不使⽤时钟信号进⾏数据同步,它们直接在数据信号中穿插⼀些⽤于同步的信号位,或者将主题数据进⾏打包,以数据帧的格式传输数据。
通讯中还需要双⽅规约好数据的传输速率(也就是波特率)等,以便更好地同步。
小技巧:如何辨别TXD和RXD端口?搞电子的人手边应该常备一个电表,用来测测电压,电阻什么的会很有用。
你只要分别测一下RS232端口的2--5或3--5针脚之间的电压,通常TXD针脚与GND之间会有3~15V左右的负电压,表示它是TXD针脚。
安装JavaCommunicationsAPISun的J2SE中并没有直接提供以上提到的任何一种串行通讯协议的开发包,而是以独立的jar包形式发布在网站上(从这里下载)----即comm.jar,称之为Javatm CommunicationsAPI,它是J2SE的标准扩展。
comm.jar并不是最近才有,早在1998年时,sun就已经发布了这个开发包。
comm.jar分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。
目前sun发布的comm.jar只有Windows和Solaris平台两个版本,如果你需要Linux平台下的,可以在/~kevinh/linuxcomm.html找到。
在使用comm.jar之前,必须知道如何安装它。
这也是困扰许多初学javaRS232通讯者的一个难题。
如果我们电脑上安装了JDK,它将同时为我们安装一份JRE(Java RuntimeEntironment),通常我们运行程序时都是以JRE来运行的。
所以以下的安装适用于JRE。
如果你是用JDK来运行程序的,请将相应的改成。
下载了comm.jar开发包后,与之一起的还有两个重要的文件,win32com.dll和m.properties。
comm.jar提供了通讯用的javaAPI,而win32com.dll提供了供comm.jar调用的本地驱动接口。
而m.properties是这个驱动的类配置文件。
首先将comm.jar复制到\lib\ext目录。
再将win21com.dll复制到你的RS232应用程序运行的目录,即user.dir。
然后将m.properties复制到\lib目录。
Java的串口通信程序首先需要到到sun主页下载串口通信的包,因为一般的jrd中不含有这个包的,有点补丁的意思。
(CSDN上也有)。
解压缩,为了使Java Communications API能够正确的与Windows系统交互,需要几个小的技巧。
下面是三个很重要的文件,你可以从Sun的网站上下载得到comm.jarwin32com.dlljavaxm.properties对于JVM来说,要正确的识别串口,将这几个文件放在系统中合适的位置使很重要的。
comm..jar应该放在以下目录中%JAVA_HOME%/lib%JAVA_HOME%/jre/lib/extwin32com.dll应该放在以下目录中%windir%system32javax.properties应该放在以下目录中%JAVA_HOME%/lib%JAVA_HOME%/jre/lib你可以通过编译和运行Sun的例程来验证串口是否可以使用了。
JBuilder中安装安装Java Communication API(以下在JBuilder 2006中测试通过)如果你使用JBuilder,那么还需要为JBuilder配置API。
一般来说,根据你的JBuilder配置,你也许需要将win32com.dll和javax.properties安装到相应的目录中,可以参照上述的目录。
例如,如果你使用JBuilder附带的JVM的话,你也许需要将win32com.dll和javax.properties放到C:\Borland\JBuilder2006\jdk1.5的相应位置。
我使用的是JCreator,在打开Configure,然后点击option,选中jdk profile然后双击选中的jdk文件,选择edit,在弹出的窗口中选择串口通信包所在的文件(.jar文件),这样配置就算完成了。
以下分别是接收和发送程序,CSDN上搜的,省的自己写了:发送程序:import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;import javaxm.*;class S_Frame extends Frame implements Runnable,ActionListener {/*检测系统中可用的通讯端口类 */static CommPortIdentifier portId;/*Enumeration 为枚举型类,在util中 */static Enumeration portList;OutputStream outputStream;/*RS-232的串行口 */SerialPort serialPort;Thread readThread;Panel p=new Panel();TextField in_message=new TextField("打开COM1,波特率9600,数据位8,停止位1.");TextArea out_message=new TextArea();Button btnOpen=new Button("打开串口, 发送数据");Button btnClose=new Button("关闭串口, 停止发送数据");byte data[]=new byte[10240];/*设置判断要是否关闭串口的标志*/boolean mark;/*安排窗体*/S_Frame(){ super("串口发送数据");setSize(200,200);setVisible(true);add(out_message,"Center");add(p,"North");p.add(btnOpen);p.add(btnClose);add(in_message,"South");btnOpen.addActionListener(this);btnClose.addActionListener(this);} //R_Frame() end/*点击按扭打开串口.*/public void actionPerformed(ActionEvent event) {if (event.getSource()==btnClose){serialPort.close(); //关闭串口mark=true; //用于中止线程的run()方法in_message.setText("串口COM1已经关闭,停止发送数据."); }else { mark=false;/*从文本区按字节读取数据*/data=out_message.getText().getBytes();/*打开串口*/start();in_message.setText("串口COM1已经打开,正在每2秒钟发送一次数据.....");}} //actionPerformed() end/*打开串口,并调用线程发送数据*/public void start(){/*获取系统中所有的通讯端口 */portList=CommPortIdentifier.getPortIdentifiers();/* 用循环结构找出串口 */while (portList.hasMoreElements()){/*强制转换为通讯端口类型*/portId=(CommPortIdentifier)portList.nextElement();if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){ if (portId.getName().equals("COM1")) {/*打开串口 */try {serialPort = (SerialPort) portId.open("ReadComm", 2000);}catch (PortInUseException e) { }/*设置串口输出流*/try {outputStream = serialPort.getOutputStream(); }catch (IOException e) {}} //if end} //if end} //while end/*调用线程发送数据*/try{readThread = new Thread(this);//线程负责每发送一次数据,休眠2秒钟readThread.start();}catch (Exception e) { }} //start() end/*发送数据,休眠2秒钟后重发*/public void run() {/*设置串口通讯参数*/try {serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);}catch (UnsupportedCommOperationException e) { } /*发送数据流(将数组data[]中的数据发送出去)*/ try {outputStream.write(data);}catch (IOException e) { }/*发送数据后休眠2秒钟,然后再重发*/try { Thread.sleep(2000);if (mark){return; //结束run方法,导致线程死亡}start();}catch (InterruptedException e) { }} //run() end} //类S_Frame endpublic class SendComm{public static void main(String args[]){ S_Frame S_win=new S_Frame();S_win.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.exit(0); }});S_win.pack();}}接收程序:import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;import javaxm.*;class R_Frame extends Frame implements Runnable,ActionListener,SerialPortEventListener {/* 检测系统中可用的通讯端口类 */static CommPortIdentifier portId;/* Enumeration 为枚举型类,在java.util中 */ static Enumeration portList;InputStream inputStream;/* 声明RS-232串行端口的成员变量 */SerialPort serialPort;Thread readThread;String str="";TextField out_message=new TextField("上面文本框显示接收到的数据");TextArea in_message=new TextArea();Button btnOpen=new Button("打开串口");/*建立窗体*/R_Frame(){super("串口接收数据");setSize(200,200);setVisible(true);btnOpen.addActionListener(this);add(out_message,"South");add(in_message,"Center");add(btnOpen,"North");} //R_Frame() end/*点击按扭所触发的事件:打开串口,并监听串口. */public void actionPerformed(ActionEvent event){/*获取系统中所有的通讯端口 */portList=CommPortIdentifier.getPortIdentifiers();/* 用循环结构找出串口 */while (portList.hasMoreElements()){/*强制转换为通讯端口类型*/portId=(CommPortIdentifier)portList.nextElement();if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){ if (portId.getName().equals("COM1")) {try {serialPort = (SerialPort) portId.open("ReadComm", 2000); out_message.setText("已打开端口COM1 ,正在接收数据..... "); }catch (PortInUseException e) { }/*设置串口监听器*/try {serialPort.addEventListener(this);}catch (TooManyListenersException e) { }/* 侦听到串口有数据,触发串口事件*/serialPort.notifyOnDataAvailable(true);} //if end} //if end} //while endreadThread = new Thread(this);readThread.start(); //线程负责每接收一次数据休眠20秒钟} //actionPerformed() end/*接收数据后休眠20秒钟*/public void run() {try {Thread.sleep(20000);}catch (InterruptedException e) { }} //run() end/*串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中*/public void serialEvent(SerialPortEvent event) {/*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/try{serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,Seri alPort.STOPBITS_1,SerialPort.PARITY_NONE);}catch (UnsupportedCommOperationException e) {}byte[] readBuffer = new byte[20];try {inputStream = serialPort.getInputStream();}catch (IOException e) {}try { /* 从线路上读取数据流 */while (inputStream.available() > 0) {int numBytes = inputStream.read(readBuffer); } //while endstr=new String(readBuffer);/*接收到的数据存放到文本区中*/in_message.append(str+"\n");}catch (IOException e) { }} //serialEvent() end} //类R_Frame endpublic class ReadComm{public static void main(String args[]){/* 实例化接收串口数据的窗体类 */R_Frame R_win=new R_Frame();/* 定义窗体适配器的关闭按钮功能 */R_win.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0); }});R_win.pack();}}希望以上资料对你有所帮助,附励志名3条:1、积金遗于子孙,子孙未必能守;积书于子孙,子孙未必能读。