实验3-201408010211-李国龙

问题描述:

HUNAN UNIVERSITY

JAVA 程序设计

实验报告

(实验三)

学生姓名 学生学号

专业班级 计科

指导老师 陆邵飞 助 教 ____ 谭志颖______________________

2016 年 12 月 12 日

第2页

目 录

实验3:图形界面设计(executable jar file) . ....................... 3

一、

问题描述 . .................................................................................................................. 3 二、

问题分析 . .................................................................................................................. 3 三、

问题步骤 . .................................................................................................................. 5 四、

调试与测试 . ............................................................................................................ 17 五、

分析与总结 . ............................................................................................................ 20

第3页

实验3:图形界面设计(executable jar file)

一、 问题描述

本实验利用Swing 实现简单的聊天程序的界面,并能实现公聊和私聊功能和保存聊天记录到文件中的功能,最后将程序打包为可执行的jar 文件。

二、 问题分析

Java 有三个主要的图形界面工具:AWT ,Swing 和SWT 。Swing 是构建java 图形界面标准的API(应用程序接口) 。SWT 是一个非常有前途的新的窗体工具,由IBM 资助。但是事实上,这三者相互补充,他们满足不同的需求。

抽象窗口工具集为简单的applet 程序设计,它不适宜用来构建丰富的桌面图形界面。但是从开始被介绍,它至少有一个好的思想就是布局管理,它负责为组件找到一个放置的位置,这种机制是必需的,因为GUI 组件在不同的操作系统中有不同的尺寸。 现在, AWT 扩展了组件模型和事件处理机制(由JavaBeans 说明定义) ,新的图形API(称为Java 2D),支持剪贴板和拖拉操作,打印,准入,和新的GUI 工具Swing ,所有这些都归到Java 基础类中(JFC)。它有一套完全的组件从按钮到文件域到表格,树型和文件编辑器。这些组件不依赖于操作系统本地的部件,而是用原始的图形像直线、矩形、文字画出。这种画代表感观插件,它能够模仿本地的感观。 Swing 也有平台无关的外观称为"Metal" 。 Swing 的结构由MVC 模式得到启发,这里在屏幕上的视觉GUI 组件和支持数据的模型对象之间有一个明显的分隔,在GUI 和数据层之间的通讯基于事件。

首先创建一个聊天程序的界面,然后添加事件,在事件中实现两个私聊和公聊功能,并用JFileChooser 实现保存聊天记录的功能。

将程序打包为可执行的jar 文件参考资料如下:

1、JAR 文件包

JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。举个例子,如果我们具有如下目录结构的一些文件:

==

`-- test

`-- Test.class

把它压缩成 ZIP 文件 test.zip ,则这个 ZIP 文件的内部目录结构为:

test.zip

`-- test

`-- Test.class

如果我们使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar ,则这个 JAR 文件的内部目录结构为:

test.jar

|-- META-INF

第4页

| `-- MANIFEST.MF

`-- test

`--Test.class

2、 创建可执行的 JAR 文件包

制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法。

Java 程序是由若干个 .class 文件组成的。这些 .class 文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或者 java 命令的 -cp 参数;运行时还要到控制台下去使用 java 命令来运行,如果需要直接双击运行必须写 Windows 的批处理文件 (.bat) 或者 Linux 的 Shell 程序。因此,许多人说,Java 是一种方便开发者苦了用户的程序设计语言。

其实不然,如果开发者能够制作一个可执行的 JAR 文件包交给用户,那么用户使用起来就方便了。在 Windows 下安装 JRE (Java Runtime Environment) 的时候,安装文件会将 .jar 文件映射给 javaw.exe 打开。那么,对于一个可执行的 JAR 文件包,用户只需要双击它就可以运行程序了,和阅读 .chm 文档一样方便 (.chm 文档默认是由 hh.exe 打开的) 。那么,现在的关键,就是如何来创建这个可执行的 JAR 文件包。

创建可执行的 JAR 文件包,需要使用带 cvfm 参数的 jar 命令,同样以上述 test 目录为例,命令如下:

jar cvfm test.jar manifest.mf test

这里 test.jar 和 manifest.mf 两个文件,分别是对应的参数 f 和 m ,其重头戏在 manifest.mf 。因为要创建可执行的 JAR 文件包,光靠指定一个 manifest.mf 文件是不够的,因为 MANIFEST 是 JAR 文件包的特征,可执行的 JAR 文件包和不可执行的 JAR 文件包都包含 MANIFEST 。关键在于可执行 JAR 文件包的 MANIFEST ,其内容包含了 Main-Class 一项。这在 MANIFEST 中书写格式如下:

Main-Class: 可执行主类全名(包含包名)

例如,假设上例中的 Test.class 是属于 test 包的,而且是可执行的类 (定义了 public static void main(String[]) 方法) ,那么这个 manifest.mf 可以编辑如下:

Main-Class: test.Test <回车>

这个 manifest.mf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: test.Test 一行,且该行以一个回车符结束即可。创建了 manifest.mf 文件之后,我们的目录结构变为:

==

|-- test

| `-- Test.class

`-- manifest.mf

这时候,需要到 test 目录的上级目录中去使用 jar 命令来创建 JAR 文件包。也就是在目录树中使用“==”表示的那个目录中,使用如下命令:

jar cvfm test.jar manifest.mf test

之后在“==”目录中创建了 test.jar ,这个 test.jar 就是执行的 JAR 文件包。运行时只需要使用 java -jar test.jar 命令即可。

需要注意的是,创建的 JAR 文件包中需要包含完整的、与 Java 程序的包结构对应的目录结构,就像上例一样。而 Main-Class 指定的类,也必须是完整的、包含包路径的类名,如上例的 test.Test ;而且在没有打成 JAR 文件包之前可以使用 java <类名> 来运行这个类,即在上例中 java test.Test 是可以正确运行的 (当然要在 CLASSPATH 正确的情况下) 。 把本实验的程序使用jar 工具打包成可执行的jar 文件。

第5页

三、 问题步骤

注解:代码的注释在工程文件中,这里只有简单说明。

1. 创建一个聊天程序的界面。

我使用的是WindowBuilder 插件。

首先创建项目,和平时不同,这次的步骤是:File-New-Other 得到如下界面:

选择JFrame 创建一个类。选择Design 来画界面。

界面的画法很简单,只需要放组件就可以了,不再一一演示了,使用到的组件对应的代码以及解释如下:

/*

* 添加菜单条

*/ JMenuBar menuBar = new JMenuBar();

setJMenuBar(menuBar );

/*

* 添加File 菜单

*/

JMenu mnFile = new JMenu("File" );

menuBar .add(mnFile );

/*

* File菜单下添加子菜单:Save, 单击Save 键将调用saveActionPerformed(e) * 函数,保存聊天内容

第6页 */

JMenuItem mntmNewMenuItem = new JMenuItem("Save" );

mntmNewMenuItem .addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e ) {

saveActionPerformed(e );

}

});

mnFile .add(mntmNewMenuItem );

/*

* File菜单下添加子菜单:Exit, 单击Exit 键将调用exitActionPerformed(e) * 函数,进入是否退出系统的操作

*/

JMenuItem mntmExit = new JMenuItem("Exit" );

mntmExit .addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e ) {

exitActionPerformed(e );

}

});

mnFile .add(mntmExit );

/*

* 添加Action 菜单

*/

JMenu mnAction = new JMenu("Action" );

menuBar .add(mnAction );

/*

* 以下几段是放置公聊,私聊面板的,而且设置为不可编辑的 */

publicScrollPane = new JScrollPane();

textTabbedPane .addTab("Public" , null , publicScrollPane , null ); publicTextPane = new JTextPane();

publicTextPane .setEditable(false );

publicScrollPane .setViewportView(publicTextPane );

privateScrollPane = new JScrollPane();

textTabbedPane .addTab("Private" , null , privateScrollPane , null ); privateTextPane = new JTextPane();

privateTextPane .setEditable(false );

privateScrollPane .setViewportView(privateTextPane );

/*

* 添加标签:Send To

*/

JLabel userLabel = new JLabel("Send To");

userLabel .setFont(new Font(" 楷体" , Font.PLAIN , 16));

/*

* 添加标签:Message:

第7页

*/ JLabel messageLable = new JLabel("Message:");

messageLable .setFont(new Font(" 楷体" , Font.PLAIN , 16));

/*

* 添加文本输入框用来输入聊天信息

*/

messageText = new JTextField();

messageText .setColumns(10);

/*

* 添加发送消息的Send 按钮,点击Send 会调用sendActionPerformed(e) * 函数来发送消息,显示到对应的区域

*/

sendButton = new JButton("Send" );

sendButton .addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e ) {

sendActionPerformed(e );

}

});

sendButton .setFont(new Font(" 楷体" , Font.PLAIN , 16));

/*

* 添加组合框,组合框第一行是:选择一个在线好友,它其实对应的是公聊, * 还没有选择一个人私聊,这里模拟的是ClientA 和ClientB 聊天,当

* 使用者是ClientA 时,组合框的第二行和第三行为ClientB 和ClientC,

* 当使用者是ClientB 时,组合框的第二行和第三行为ClientA 和ClientC, */

userComboBox = new if (mySelf .equals("ClientA" )){

}else if (mySelf .equals("ClientB" )){

}

最终得到的界面为:

第8页

2. 添加事件实现公聊,私聊功能。

这里主要是实现Send 功能。

流程就是读取输入文本框中的内容,根据组合框中选择的项决定是公聊还是和某人私聊,然后点击Send, 则内容显示到公聊窗口或者私聊窗口,另一个人的对应窗口也会显示相应的聊天消息。

Send 的实现如下:

/*

* 发送消息的函数,它实现了两个窗口的通讯

*/

private void sendActionPerformed(ActionEvent evt ) {

//将输入文本框的内容赋给字符串message

String message =this . messageText .getText();

//得到当前组合框的索引值,0代表第一项,1代表第二项,2代表第三项

int index =this . userComboBox .getSelectedIndex();

/*

* index为0代表公聊

*/

if (index ==0){

//切换到公聊窗口

textTabbedPane .setSelectedIndex(0);

/*

* 初始时flag0为true, 聊天板上为空,输入第一条消息后聊天板不为空,

* 则flag0设为false

*/

if (flag0){

flag0=false ;

publicTextPane .setText(" 我:"+message );

/*

* 根据发送消息的人是谁,设置另一个人的对应窗口显示的内容为

第13页

for (int i =0;i <aa2. length ; i ++){

bw .write(aa2[i ]);

bw .newLine();

}

bw .close();

} catch (IOException ex ) {

ex .printStackTrace();

}

} }

演示一下保存:

点击Save 则会出现如下界面:

找到一个位置,输入文件名,点击保存即可。

打开文件查看内容发现没有一点错误。

第14页

退出系统使用JOptionPane.showConfirmDialog 函数即可。代码如下: /*

* Exit调用的函数,点击Exit, 便会出现窗口询问是否退出系统,result=0意味着

* 选中了是,则退出系统,其他则不退出

*/

private void exitActionPerformed(ActionEvent evt ) {

int result =JOptionPane.showConfirmDialog (null , " 是否退出系统" );

if (result ==0){

dispose(); }

}

点击Exit 便会弹出窗口:

点击是则退出,点击否或取消不会退出。 4. 将程序打包为可执行的jar 文件。

(1) 在eclipse 中找到你要导出的java 程序, 选中它。

第15页

(2)点击File-Export, 在弹出的Export 对话框中找到JAR file,单击选中-->Next。

(3) 选好你的java 程序,勾选右栏两个选项,选择保存的文件名和位置,最后点Next 。

第16页

(4) 出现下面这个图片时, 点击Browser 浏览你的java 文件,选择程序入口java 文件。

第17页

(5) 选中你的入口程序后, 点Finish 即可。

四、 调试与测试

这里展示的是最终的测试,将每个注意的地方综合起来,测试结果如下: 公聊:

第18页

私聊:

保存文件:

第19页

退出系统:

点击是则退出,点击否或取消不会退出。

使用jar 文件执行程序和上述一样可以执行所有功能。

第20页

五、 分析与总结

1. 本次实验第一步是实现可视化界面,如果安装了可视化插件则操作起来十分容易,只需要拖组件到面板上即可,这里就属可切换公聊,私聊的面板复杂一些。

2. 实现退出系统很简单,调用一个JOptionPane.showConfirmDialog 函数即可轻松解决,保存文件是我第一次接触到JFileChooser ,网上查了一下它的用法就解决了,在写入文件时一开始没有换行,在分析后我采用换行符分割字符串,一行一行的写入文件就解决了。

3. 因为现在没有学过Socket 通信,我只能实现比较low 的通信,不过还是费了一些功夫才调试成这样的比较逼真的实现,看起来还是实现了公聊和私聊功能的。

4. 第一次将程序打包为可执行的jar 文件,步骤很简单,很方便。

1个回答 分类:综合 2018-01-23

问题解答:

我来补答
 
 
展开全文阅读
剩余:2000