实验308010211李国龙文档格式.docx
《实验308010211李国龙文档格式.docx》由会员分享,可在线阅读,更多相关《实验308010211李国龙文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
但是事实上,这三者相互补充,他们满足不同的需求。
抽象窗口工具集为简单的applet程序设计,它不适宜用来构建丰富的桌面图形界面。
但是从开始被介绍,它至少有一个好的思想就是布局管理,它负责为组件找到一个放置的位置,这种机制是必需的,因为GUI组件在不同的操作系统中有不同的尺寸。
现在,AWT扩展了组件模型和事件处理机制(由JavaBeans说明定义),新的图形API(称为Java2D),支持剪贴板和拖拉操作,打印,准入,和新的GUI工具Swing,所有这些都归到Java基础类中(JFC)。
它有一套完全的组件从按钮到文件域到表格,树型和文件编辑器。
这些组件不依赖于操作系统本地的部件,而是用原始的图形像直线、矩形、文字画出。
这种画代表感观插件,它能够模仿本地的感观。
Swing也有平台无关的外观称为"
Metal"
。
Swing的结构由MVC模式得到启发,这里在屏幕上的视觉GUI组件和支持数据的模型对象之间有一个明显的分隔,在GUI和数据层之间的通讯基于事件。
首先创建一个聊天程序的界面,然后添加事件,在事件中实现两个私聊和公聊功能,并用JFileChooser实现保存聊天记录的功能。
将程序打包为可执行的jar文件参考资料如下:
1、JAR文件包
JAR文件就是JavaArchiveFile,顾名思意,它的应用是与Java息息相关的,是Java的一种文档格式。
JAR文件非常类似ZIP文件——准确的说,它就是ZIP文件,所以叫它文件包。
JAR文件与ZIP文件唯一的区别就是在JAR文件的内容中,包含了一个META-INF/MANIFEST.MF文件,这个文件是在生成JAR文件的时候自动创建的。
举个例子,如果我们具有如下目录结构的一些文件:
==
`--test
`--Test.class
把它压缩成ZIP文件test.zip,则这个ZIP文件的内部目录结构为:
test.zip
如果我们使用JDK的jar命令把它打成JAR文件包test.jar,则这个JAR文件的内部目录结构为:
test.jar
|--META-INF
| `--MANIFEST.MF
`--Test.class
2、创建可执行的JAR文件包
制作一个可执行的JAR文件包来发布你的程序是JAR文件包最典型的用法。
Java程序是由若干个.class文件组成的。
这些.class文件必须根据它们所属的包不同而分级分目录存放;
运行前需要把所有用到的包的根目录指定给CLASSPATH环境变量或者java命令的-cp参数;
运行时还要到控制台下去使用java命令来运行,如果需要直接双击运行必须写Windows的批处理文件(.bat)或者Linux的Shell程序。
因此,许多人说,Java是一种方便开发者苦了用户的程序设计语言。
其实不然,如果开发者能够制作一个可执行的JAR文件包交给用户,那么用户使用起来就方便了。
在Windows下安装JRE(JavaRuntimeEnvironment)的时候,安装文件会将.jar文件映射给javaw.exe打开。
那么,对于一个可执行的JAR文件包,用户只需要双击它就可以运行程序了,和阅读.chm文档一样方便(.chm文档默认是由hh.exe打开的)。
那么,现在的关键,就是如何来创建这个可执行的JAR文件包。
创建可执行的JAR文件包,需要使用带cvfm参数的jar命令,同样以上述test目录为例,命令如下:
jarcvfmtest.jarmanifest.mftest
这里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包的,而且是可执行的类(定义了publicstaticvoidmain(String[])方法),那么这个manifest.mf可以编辑如下:
test.Test<
回车>
这个manifest.mf可以放在任何位置,也可以是其它的文件名,只需要有Main-Class:
test.Test一行,且该行以一个回车符结束即可。
创建了manifest.mf文件之后,我们的目录结构变为:
|--test
| `--Test.class
`--manifest.mf
这时候,需要到test目录的上级目录中去使用jar命令来创建JAR文件包。
也就是在目录树中使用“==”表示的那个目录中,使用如下命令:
之后在“==”目录中创建了test.jar,这个test.jar就是执行的JAR文件包。
运行时只需要使用java-jartest.jar命令即可。
需要注意的是,创建的JAR文件包中需要包含完整的、与Java程序的包结构对应的目录结构,就像上例一样。
而Main-Class指定的类,也必须是完整的、包含包路径的类名,如上例的test.Test;
而且在没有打成JAR文件包之前可以使用java<
类名>
来运行这个类,即在上例中javatest.Test是可以正确运行的(当然要在CLASSPATH正确的情况下)。
把本实验的程序使用jar工具打包成可执行的jar文件。
三、问题步骤
注解:
代码的注释在工程文件中,这里只有简单说明。
1.创建一个聊天程序的界面。
我使用的是WindowBuilder插件。
首先创建项目,和平时不同,这次的步骤是:
File-New-Other得到如下界面:
选择JFrame创建一个类。
选择Design来画界面。
界面的画法很简单,只需要放组件就可以了,不再一一演示了,使用到的组件对应的代码以及解释如下:
/*
*添加菜单条
*/
JMenuBarmenuBar=newJMenuBar();
setJMenuBar(menuBar);
*添加File菜单
JMenumnFile=newJMenu("
File"
);
menuBar.add(mnFile);
*File菜单下添加子菜单:
Save,单击Save键将调用saveActionPerformed(e)
*函数,保存聊天内容
JMenuItemmntmNewMenuItem=newJMenuItem("
Save"
mntmNewMenuItem.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
saveActionPerformed(e);
}
});
mnFile.add(mntmNewMenuItem);
/*
Exit,单击Exit键将调用exitActionPerformed(e)
*函数,进入是否退出系统的操作
JMenuItemmntmExit=newJMenuItem("
Exit"
mntmExit.addActionListener(newActionListener(){
exitActionPerformed(e);
mnFile.add(mntmExit);
*添加Action菜单
JMenumnAction=newJMenu("
Action"
menuBar.add(mnAction);
*以下几段是放置公聊,私聊面板的,而且设置为不可编辑的
publicScrollPane=newJScrollPane();
textTabbedPane.addTab("
Public"
null,publicScrollPane,null);
publicTextPane=newJTextPane();
publicTextPane.setEditable(false);
publicScrollPane.setViewportView(publicTextPane);
privateScrollPane=newJScrollPane();
Private"
null,privateScrollPane,null);
privateTextPane=newJTextPane();
privateTextPane.setEditable(false);
privateScrollPane.setViewportView(privateTextPane);
*添加标签:
SendTo
JLabeluserLabel=newJLabel("
SendTo"
userLabel.setFont(newFont("
楷体"
Font.PLAIN,16));
Message:
JLabelmessageLable=newJLabel("
"
messageLable.setFont(newFont("
*添加文本输入框用来输入聊天信息
messageText=newJTextField();
messageText.setColumns(10);
*添加发送消息的Send按钮,点击Send会调用sendActionPerformed(e)
*函数来发送消息,显示到对应的区域
sendButton=newJButton("
Send"
sendButton.addActionListener(newActionListener(){
sendActionPerformed(e);
sendButton.setFont(newFont("
*添加组合框,组合框第一行是:
选择一个在线好友,它其实对应的是公聊,
*还没有选择一个人私聊,这里模拟的是ClientA和ClientB聊天,当
*使用者是ClientA时,组合框的第二行和第三行为ClientB和ClientC,
*当使用者是ClientB时,组合框的第二行和第三行为ClientA和ClientC,
userComboBox=newJComboBox();
userComboBox.addItem("
选择一个在线好友"
if(mySelf.equals("
ClientA"
)){
userComboBox.addItem("
ClientB"
}elseif(mySelf.equals("
}
userComboBox.addItem("
ClientC"
最终得到的界面为:
2.添加事件实现公聊,私聊功能。
这里主要是实现Send功能。
流程就是读取输入文本框中的内容,根据组合框中选择的项决定是公聊还是和某人私聊,然后点击Send,则内容显示到公聊窗口或者私聊窗口,另一个人的对应窗口也会显示相应的聊天消息。
Send的实现如下:
*发送消息的函数,它实现了两个窗口的通讯
*/
privatevoidsendActionPerformed(ActionEventevt){
//将输入文本框的内容赋给字符串message
Stringmessage=this.messageText.getText();
//得到当前组合框的索引值,0代表第一项,1代表第二项,2代表第三项
intindex=this.userComboBox.getSelectedIndex();
*index为0代表公聊
if(index==0){
//切换到公聊窗口
textTabbedPane.setSelectedIndex(0);
/*
*初始时flag0为true,聊天板上为空,输入第一条消息后聊天板不为空,
*则flag0设为false
*/
if(flag0){
flag0=false;
publicTextPane.setText("
我:
+message);
/*
*根据发送消息的人是谁,设置另一个人的对应窗口显示的内容为Client*:
+
*消息内容的形式
*/
if(mySelf.equals("
frame2.textTabbedPane.setSelectedIndex(0);
frame2.publicTextPane.setText("
ClientA:
}elseif(mySelf.equals("
frame.textTabbedPane.setSelectedIndex(0);
frame.publicTextPane.setText("
ClientB:
}
*flag0为false则面板不为空,则采用获取原来内容+新内容再放置到面板上的方式
}else{
publicTextPane.setText(publicTextPane.getText()+'
\n'
+"
frame2.publicTextPane.setText(frame2.publicTextPane.getText()+'
frame.publicTextPane.setText(frame.publicTextPane.getText()+'
*index为1代表私聊,私聊对象为ClientA或ClientB
}elseif(index==1){
//切换到私聊窗口
textTabbedPane.setSelectedIndex
(1);
*初始时flag1为true,聊天板上为空,输入第一条消息后聊天板不为空,
*则flag1设为false
if(flag1){
flag1=false;
privateTextPane.setText("
我对"
+userComboBox.getSelectedItem()+"
说:
*根据发送消息的人是谁,设置另一个人的对应窗口显示的内容为Client*对我说:
frame2.textTabbedPane.setSelectedIndex
(1);
frame2.privateTextPane.setText("
ClientA对我说:
frame.textTabbedPane.setSelectedIndex
(1);
frame.privateTextPane.setText("
ClientB对我说:
*flag1为false则面板不为空,则采用获取原来内容+新内容再放置到面板上的方式
privateTextPane.setText(privateTextPane.getText()+'
frame2.privateTextPane.setText(frame2.privateTextPane.getText()+'
frame.privateTextPane.setText(frame.privateTextPane.getText()+'
*index为2代表和ClientC私聊,因为内容和ClientB,ClientA二人聊天
*一致,所以不再多写了
}elseif(index==2){
}
演示一下发消息:
公聊:
私聊:
3.将“公聊”及“私聊”的聊天内容保存为文件以及退出系统。
保存到文件就是利用JFileChooser来打开文件选择框,然后利用文件的写操作将聊天内容写入文件中。
代码如下:
*保存聊天内容的函数
privatevoidsaveActionPerformed(ActionEventevt){
//将公聊内容赋给字符串ss
Stringss=this.publicTextPane.getText();
//将私聊内容赋给字符串ss2
Stringss2=this.privateTextPane.getText();
//创建文件选择框
JFileChooserjfc=newJFileChooser();
*打开文件选择框进行保存文件操作
if(JFileChooser.APPROVE_OPTION==jfc.showSaveDialog(this)){
//要保存的文件
FilesaveFile=jfc.getSelectedFile();
try{
//文件不存在则创建
if(!
saveFile.exists()){
saveFile.createNewFile();
BufferedWriterbw=newBufferedWriter(newFileWriter(saveFile));
//按换行符分割字符串ss,使得聊天内容写入文件看起来清楚
S