第一篇:实验6JavaAWT及Swing应用
实验6 Java AWT及Swing应用
实验内容
(1)按钮有序排列(2)密码验证问题
(3)名片录入管理界面设计(4)文字字体设计窗体
1、按钮有序排列
实验目的:(1)了解 GUI 的概念 ;
(2)了解 java.awt 包和 javax.swing 包, 以及比较它们具有的同性质的组件的异同;(3)掌握和运用 Java 的基本GUI 组件, 了解它们的特点。
实验任务:
本实验要求定义按钮若干让它们按照从左向右的顺序依次排列, 显示5个带图标的按钮。
实验步骤:
在 Eclipse 中新建一个 Chapter11项目 , 按照下列要求完成实验。练习: 调试和运行程序 ButtonCounter.java;
要求: 在当前项目Chapter11中, 新建一个文件ButtonCounter.java, 将程序清单3-1 中的程序输入并保存。该程序可以定义按钮若干使它们按照从左向右的顺序依次排列, 显示5个带图标的按钮 , 运行结果如图1所示。阅读和分析程序ButtonCounter.java, 调试编译并运行该程序。
图1 程序清单
3-1 ButtonCounter.java //ButtonCounter.java import javax.swing.*;import java.awt.*;
public class ButtonCounter extends JFrame {
public ButtonCounter(){
super(“显示按钮窗口”);
ImageIcon Icon = new ImageIcon(“image/image.gif”);
JButton jbt1 = new JButton(“按钮”,Icon);
JButton jbt2 = new JButton(“按钮”,Icon);
JButton jbt3 = new JButton(“按钮”,Icon);
JButton jbt4 = new JButton(“按钮”,Icon);
JButton jbt5 = new JButton(“按钮”,Icon);
JPanel p1 = new JPanel();
p1.add(jbt1);
JPanel p2 = new JPanel();
p2.add(jbt2);
JPanel p3 = new JPanel();
p2.add(jbt3);
JPanel p4=new JPanel();
p4.add(jbt4);
JPanel p5=new JPanel();
p5.add(jbt5);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(p1);
getContentPane().add(p2);
getContentPane().add(p3);
getContentPane().add(p4);
getContentPane().add(p5);
}
public static void main(String[] args){
// Create a frame and set its properties
JFrame frame = new ButtonCounter();
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} } 思考
(1)在程序的 main()方法中有语句Frame.pack(), 该方法的作用是什么 ?
该方法的作用是自动确定Frame的大小。
(2)程序中语句Frame.setDefaultCloseOperation(JFrame.EXIT-ON-CLOSE);的作用是什么 ? 去掉该语句 , 程序会出现怎样的运行结果 ?
该语句的作用是使执行程序结束。去掉该语句,关闭窗口,但是命令提示符并没有正常结束。需要按Ctrl+C才行。
(3)如果将程序中的语句 getContentPane().setLayout(new FlowLayout());去掉 , 程序的运行结果会发生变化吗 ? 如果不发生变化是什么原因 ? 如果发生变化 , 会出现什么现象 ? 请解释原因。
程序的运行结果会发生变化,只出现一个按钮。因为去掉该语句后,布局管理器被取消了,只有调用每个组件的相关方法,才能为这些组件在容器中一一定位。
(4)如果将程序中的按钮组件 jbtl 换成 java.awt 包中的 Button 组件对象 , 换过后的组件和原来的 JButton 在外观上会出现什么不同 ?
颜色不同,Button 组件颜色是灰色,同JPanel相同。
注意 : 在使用 Eclipse 时 , 如果在运行的时候希望能调用一些图片 , 可以将图片放在定义该项目 Chapterll 下的目录 image 中 , 如果没有该目录 , 需要用户自己定义一个 image 目录。在编写程序的时候 , 就可以通过相对路径 “image/xxx.gif“ 等形式装载图片。
2、密码验证问题
实验目的 :
(l)进一步了解和掌握 javax.swing 包中的常用 GUI 组件;
(2)比较 Swing 包中的 JTextField 和 JPasswordField 在使用中的异同;
(3)初步了解和运用事件处理机制和 Action 事件的处理。
实验任务:
编写一个 Java 程序 , 实现用户根据自己的密码进入界面, 如果用户输入信息正确 , 则输出 “ 欢迎×××u29992X户 ”, 否则用户还可以尝试两次 , 如果尝试阶段输入信息错误, 则输出 “ 请输入正确的信息 ”, 如果尝试失败 , 用户则退出。
实验步骤 :
打开 Eclipse, 打开一个已有项目如 Chapter3, 在该项目下完成如下练习。
练习: 密码验证
要求: 在当前项目如Chapter3下, 新建一个文件PasswordVerification.java, 将程序清单 3-2 中的程序输入并保存。要求该程序完成如下功能 : 用户根据自己的密码进入界面 , 如果用户输入信息正确 , 则输出 “ 欢迎××× ”, 否则用户还可以尝试两次 , 如果尝试阶段输入信息错误 , 则输出 “请输入正确的信息” , 如果尝试失败 , 用户则退出。调试并编译程序 PasswordVerification.java, 运行该程序 , 运行结果如图2、图 3和图 4所示 , 请将该程序中的代码1~代码7补充完整。
图2
图3 3
图4 程序清单 3-2 PasswordVerification.java //PasswordVerification.java import javax.swing.*;import java.awt.event.*;
import java.awt.*;public class PasswordVerification extends JFrame implements ActionListener{ JLabel userLabel;//定义用户标签提示
JLabel passwordLabel;//定义密码标签提示
JTextField userText;//定义用户文本框
JPasswordField passwordText;//定义密码文本框
int count=1;//统计输入信息的次数
public PasswordVerification(){ super(”请输入信息“);
Container container=getContentPane();//得到容器对象container;
container.setLayout(new FlowLayout());//设置默认布局
userLabel=new JLabel(”用户名“);//创建用户标签
passwordLabel=new JLabel(”密 码“);//创建密码标签
userText=new JTextField();//创建用户文本输入框
passwordText=new JPasswordField();//创建密码输入文本框
passwordText.addActionListener(this);//注册事件监听者;container.add(userLabel);container.add(userText);container.add(passwordLabel);container.add(passwordText);setSize(240,100);setVisible(true);
}
public void actionPerformed(ActionEvent e){//事件处理
String userName=new String(”陈三“);//假设为正确的用户名;String password=new String(”12345678“);//假设为正确的密码;
if(e.getSource()==passwordText){ count++;
char[] passwords=passwordText.getPassword();
if(userText.getText().equals(userName)&&password.equals(new String(passwords))){
JOptionPane.showMessageDialog(null, ”欢迎您:“ + userName);
System.exit(0);
}
else if(count>3)System.exit(0);else{
JOptionPane.showMessageDialog(null,userText.getText()+”请输入正确信息“);} } }
public static void main(String args[]){
PasswordVerification pv=new PasswordVerification();pv.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} 思考
(1)程序 PasswordVerification.java 中第 3 行语句 java.awt.* 的作用是什么 ? 引入java.awt包中所有的类。
(2)程序 actionPerformed()方法中 if(e.getSource()==passwordText)的作用是什么 ? 如果去掉该条件判断 , 程序运行结果会发生什么变化 ?
该语句的作用是判断事件源是否为passwordText。去掉该条件判断,程序运行结果无变化。(3)观察程序actionperformed()方法中语句”char[]passwords =passwordText.getPassword();“的作用是什么 ?
从密码文本框获取密码,并将其存入passwords数组中。
(4)观 察 程 序 中 定 义 的 main()方 法
, 如 果 在 PasswordVerification pv=new passwordverification();语句后 , 添加语句 System.exit(0), 会出现什么问题 , 为什么 ?
程序被终止运行,因为该语句的作用是终止当前正在运行的 Java 虚拟机。
(5)从给定程序的运行结果看 , 密码输入的回显字符是 ”*“, 如果把回显字符换成”#“, 该如何处理 ?
在构造函数中添加passwordText.setEchoChar('#');语句。
(6)如果要求在信息输入错误处理中 , 一旦输入完密码信息 , 用户输入框和密码输入框可以清空 , 请将上述程序修改 , 使之实现该功能。
在最后一个else中添加以下代码:userText.setText(”“);
passwordText.setText(”“);
3、名片录入管理界面设计
实验目的 :
(l)进一步了解和运用常用的 GUI 组件;
(2)深入了解和运用 5 种常用的布局管理 :FlowLayout、BorderLayout、CardLayout、GridLayout 和 GridBagLayout, 掌握 5 种布局管理的特点 , 并掌握一些常用组件容器的默认布局管理方式 :
(3)比较常用的布局管理方式的不同和使用的条件。
实验任务 :
设计一个简单的通用名片录入界面 , 名片的信息包括姓名、称谓、工作单位、工作地 5
址、电话 1、电话 2、手机、传真、邮编等基本内容。本实验由下面两个练习组成。练习: 设计顺序排列的名片录入管理界面;实验步骤 :
打开 Eclipse, 打开一个项目如 Chapter3, 在该项目下完成如下练习。
练习
设计顺序排列的名片录入管理界面,本练习是考察用户对 FlowLayout 布局管理器的应用。
要求 : 在当前项目如 Chapter3下, 新建一个文件CardManager.java,将程序清单3-3中的程序输入并保存。通过一个CardManager.java文件 , 实现一个简单的通用名片录入界面 , 名片的信息包括姓名、称谓(可以包括总裁、总经理、经理、主任、处长、院长、校长、科长、教授、博士等)、工作单位、工作地址、电话 1、电话 2、手机、传真、邮编等基本内容 , 用户选择确定按钮 , 表示输入 , 如果选择取消按钮 , 表示关闭窗口。运行结果可以如图5所示。观察运行结果 , 阅读和分析程序 CardManager.java,请将程序中代码1~代码7处补充完整。
图5 程序清单3-3 CardManager.java
import javax.swing.*;import java.awt.*;
import java.awt.event.*;
public class CardManager extends JFrame{
JLabel nameLabel,sexLabel,titleLabel,unitLabel;
JLabel addressLabel,telLabel1,telLabel2,mobileLabel,faxLabel,emailLabel;JTextField nameTxt,unitTxt,addressTxt;JTextField telTxt1,telTxt2,mobileTxt,faxTxt,emailTxt;JRadioButton sexBtn1,sexBtn2;JComboBox titleBx;JButton okBtn,cancelBtn;public CardManager(){ super(”名片录入管理“);
Container c=getContentPane();
JPanel centerPanel=new JPanel();//输入面板
nameLabel=new JLabel(”姓名“);//定义姓名标签
nameTxt=new JTextField(10);//定义姓名文本输入框
centerPanel.add(nameLabel);centerPanel.add(nameTxt);
sexLabel=new JLabel(”性别“);//定义性别标签
sexBtn1=new JRadioButton(”男“);//定义性别单选按钮1 sexBtn2= new JRadioButton(”女“);//定义性别单选按钮2 ButtonGroup group=new ButtonGroup();group.add(sexBtn1);group.add(sexBtn2);centerPanel.add(sexLabel);centerPanel.add(sexBtn1);
centerPanel.add(sexBtn2);
titleLabel=new JLabel(”称谓“);//定义称谓标签
String title[]={”总裁“,”总经理“,”经理“,”主任“,”处长“,”院长“,”校长“,”科长“,”教授“,”讲师“};//定义称谓内容
titleBx=new JComboBox();//创建称谓文本输入框
titleBx.setMaximumRowCount(5);centerPanel.add(titleLabel);
centerPanel.add(titleBx);
unitLabel=new JLabel(”工作单位“);//定义工作单位标签
unitTxt=new JTextField(30);//定义工作单位输入框
centerPanel.add(unitLabel);centerPanel.add(unitTxt);
addressLabel=new JLabel(”工作地址“);//定义工作地址标签
addressTxt=new JTextField(30);//定义工作地址输入框
centerPanel.add(addressLabel);centerPanel.add(addressTxt);
telLabel1=new JLabel(”电话“);//定义电话1标签
telTxt1=new JTextField(15);//定义电话1输入框
centerPanel.add(telLabel1);centerPanel.add(telTxt1);
telLabel2=new JLabel(”电话“);//定义电话2标签
telTxt2=new JTextField(15);//定义电话2输入框
centerPanel.add(telLabel2);
centerPanel.add(telTxt2);
mobileLabel=new JLabel(”手机“);//定义手机标签
mobileTxt=new JTextField(15);//定义手机输入框
centerPanel.add(mobileLabel);
centerPanel.add(mobileTxt);
faxLabel=new JLabel(”传真“);//定义传真标签
faxTxt=new JTextField(15);//定义传真输入框
centerPanel.add(faxLabel);centerPanel.add(faxTxt);
emailLabel=new JLabel(”E-mail“);//定义email标签
emailTxt=new JTextField(32);//定义email输入框
centerPanel.add(emailLabel);centerPanel.add(emailTxt);
JPanel sPanel=new JPanel();//按钮面板
okBtn=new JButton(”确定“);//定义确定按钮
cancelBtn=new JButton(”取消“);//定义取消按钮
cancelBtn.addActionListener(new ActionListener(){//监视cancelBtn的动作
public void actionPerformed(ActionEvent e){
if(e.getSource()==cancelBtn){//判断事件源是否是cancelBtn;System.exit(0);} } });
sPanel.add(okBtn);
sPanel.add(cancelBtn);
c.setLayout(new BorderLayout());
c.add(centerPanel, BorderLayout.CENTER);//将centerPanel放置c中的中间位置;
c.add(sPanel, BorderLayout.SOUTH);//将sPanel 放置c中的南面的位置;
setSize(418,250);setVisible(true);
}
public static void main(String args[]){ CardManager cm=new CardManager();
cm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
} 思考
(1)观察程序 CardManager()方法中的程序段 : ButtonGroup group=newButtonGroup();
group.add(sexBtnl);group.add(sexBtn2);
组件对象 group 的作用是什么 ? 如果将 group 去掉 , 程序的运行结果会发生什么变化? 为什么 ?
group 的作用是定义单选按钮控件组。如果将 group 去掉,添加的两个性别选择按钮可以同时选定,因为此时是向JFrame类中分别添加两个单选按钮,它们之间没有影响。(2)观察运行结果 , 如果将窗口的大小改变 , 运行结果会发生什么变化? 为什么?
窗口的大小改变时,组件的位置会变化,但组件的大小不改变。因为布局管理器为BorderLayout()。
4、文字字体设计窗体
实验目的 :
(1)进一步了解 Swing 包中的高级 GUI 组件;
(2)了解项目事件的处理以及匿名对象在事件处理中的应用;(3)了解和运用 Swing 包中的外观设置。
实验任务 :
设计一个文字字体设计窗体 , 在该窗体中可以设置要显示文字的字体内容 , 包括字体名称、字体大小、粗体和斜体等字体风格。
实验步骤 :
打开 Eclipse, 选择已有的项目如 Chapter3, 然后按照下列要求完成实验。
要求 : 在当前项目如 Chapter3.jpx 下 , 新建一个文件 ArtFont.java, 将程序清单3-4中的程序输入并保存。本练习的要求是设计一个字体设计的窗体 , 使用户可以根据选择 , 将字体按照字体名称、字体大小、粗体和斜体风格进行设置。阅读和分析程序清单 3-4中的 ArtFont.java, 将程序中程序段1~程序段4补充完成 , 并回答思考题。程序的运行结果如图6所示。
图6 程序清单3-4 ArtFont.java //ArtFont.java
import javax.swing.*;import java.awt.*;import java.awt.event.*;
public class ArtFont extends JFrame implements ActionListener{
JComboBox fontType,fontSize;
JCheckBox boldBx;//粗体按钮
JCheckBox italicBx;//斜体按钮
JButton colorBtn;//颜色按钮;
String[] fontNames;//字体名称;
String[] fontSizes;//字体尺寸;
JLabel label;//输入提示标签;
JTextField inputText;//文字输入框;
JTextArea txtArea;//文字显示区;
JPanel fontPanel;//字体设置;
JPanel showPanel;//显示效果区
Font font;
int boldStyle,italicStyle,underlineStyle;
int fontSizeStyle;
String fontNameStyle;
Color colorStyle=Color.black;//设置字体的默认颜色为黑色;
public ArtFont(){
super(”字体设置“);
//设置默认字体
boldStyle=0;
italicStyle=0;
underlineStyle=0;
fontSizeStyle=10;
fontNameStyle=”宋体“;
font=new Font(fontNameStyle,boldStyle+italicStyle,fontSizeStyle);fontPanel=new JPanel();
fontPanel.setLayout(new FlowLayout());//设置字体名字
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
fontNames=ge.getAvailableFontFamilyNames();//获得系统中所有字体的名字;
fontType=new JComboBox(fontNames);
fontType.setEditable(false);
fontType.setMaximumRowCount(10);
fontType.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){ //实现监听字体名字改变的事件
int num = new Integer(fontSize.getSelectedItem().toString()).intValue();
font = new Font(fontType.getSelectedItem().toString(), Font.PLAIN, num);
txtArea.setFont(font);
}
});
//设置字体大小
fontSizes=new String[63];
for(int i=0;i<63;i++){
fontSizes[i]=Integer.toString((i+10));
}
fontSize=new JComboBox(fontSizes);
fontSize.setEditable(false);
fontSize.setMaximumRowCount(10);
fontSize.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){ //实现监听字体大小改变的方法
int num = new Integer(fontSize.getSelectedItem().toString()).intValue();
font = new Font(fontType.getSelectedItem().toString(), Font.PLAIN, num);
txtArea.setFont(font);
}
});
//设置粗体选择按钮;
boldBx=new JCheckBox(”粗体“);
boldBx.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){ //实现监听选择粗体状态改变的方法
int num = new Integer(fontSize.getSelectedItem().toString()).intValue();
if(italicBx.isSelected()&& boldBx.isSelected()){
font = new Font(fontType.getSelectedItem().toString(), Font.ITALIC + Font.BOLD, num);
txtArea.setFont(font);
} else if(boldBx.isSelected()){
font = new Font(fontType.getSelectedItem().toString(), Font.BOLD, num);
txtArea.setFont(font);
}
}
});
//设置斜体选择按钮;
italicBx=new JCheckBox(”斜体“);
italicBx.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
//实现监听选择斜体状态改变的方法
int num = new Integer(fontSize.getSelectedItem().toString()).intValue();
if(italicBx.isSelected()&& boldBx.isSelected()){
font = new Font(fontType.getSelectedItem().toString(), Font.ITALIC + Font.BOLD, num);
txtArea.setFont(font);
} else if(italicBx.isSelected()){
font = new Font(fontType.getSelectedItem().toString(), Font.ITALIC, num);
txtArea.setFont(font);
}
}
});
//设置颜色选择;
colorBtn=new JButton(”颜色“);
colorBtn.addActionListener(this);
//设置字体面板;
fontPanel.add(fontType);
fontPanel.add(fontSize);
fontPanel.add(boldBx);fontPanel.add(italicBx);fontPanel.add(colorBtn);//设置输入提示标签
label=new JLabel(”输入“);
//设置文本输入框;
inputText=new JTextField(30);
inputText.addActionListener(this);
//设置文本显示区;
txtArea=new JTextArea(10,80);//20行80列;
txtArea.setFont(font);
//设置文本面板;
showPanel=new JPanel();
showPanel.add(label);
showPanel.add(inputText);
showPanel.setLayout(new FlowLayout());
showPanel.add(new JScrollPane(txtArea));
//设置容器;
Container container=getContentPane();
container.setLayout(new BorderLayout());
container.add(fontPanel,BorderLayout.NORTH);
container.add(showPanel,BorderLayout.CENTER);
setSize(500,300);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==colorBtn){//改变颜色
colorStyle=JColorChooser.showDialog(this,”选择字体颜色",colorStyle);
colorBtn.setForeground(colorStyle);
txtArea.setForeground(colorStyle);
}
else if(e.getSource()==inputText){//将输入文字在文字显示区表示;
txtArea.setText(inputText.getText());
}
}
public static void main(String args[]){
ArtFont artFont=new ArtFont();
artFont.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} }
(1)程序可以编译正常、运行正常吗? 如果不能, 是因为什么原因 ? 程序可以编译正常、运行正常。
(2)如果将程序ArtFont.java中所有的匿名监听者改为this, 那么程序主要会做什么变动? 请写出。
将程序中fontType、fontSize、boldBx、italicBx的addItemListener方法中的参数new ItemListener()改为this,并将紧随其后的方法体去掉。再加入以下代码: public void itemStateChanged(ItemEvent e){
int num = new Integer(fontSize.getSelectedItem().toString()).intValue();
if(italicBx.isSelected()&& boldBx.isSelected()){
font = new Font(fontType.getSelectedItem().toString(), Font.ITALIC + Font.BOLD, num);
txtArea.setFont(font);
} else if(boldBx.isSelected()){
font = new Font(fontType.getSelectedItem().toString(), Font.BOLD, num);
txtArea.setFont(font);
} else if(italicBx.isSelected()){
font= new Font(fontType.getSelectedItem().toString(), Font.ITALIC, num);
txtArea.setFont(font);
} else {
font= new Font(fontType.getSelectedItem().toString(), Font.PLAIN, num);
txtArea.setFont(font);
}
} 13
第二篇:多媒体技术及应用实验
实验
一、利用Photoshop制作个性化名片
开发工具:Photoshop CS5
实验要求:利用合适的素材,再加上自己的创意设计,设计出漂亮的一款富有创意的学生本人的个性化名片。
实验报告:(1)打印版(2)电子版(包含图层信息的*.PSD文件)。
实验
二、利用Authorware制作个人自荐书
开发工具:Authorware 7.0
实验要求:利用Authorware集成声音、文本、图像及视频等各种素材制作出能够实际使用的个人自荐书软件。
实验报告:(1)打印版(2)电子版(打包后的*.exe文件)。
第三篇:实验06 线程应用及线程并发库
实验六 线程应用及线程并发库
1.实验内容
实验题1编写一程序,实现如下功能:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,主线程循环100次,如此循环50次。package cn.jp.me;
public class ManageProcedure {
public synchronized void addMainProcedure(){
if(shouldBeSub){ try { wait();
} } for(int i = 1;i <= subTimes;++i){ } shouldBeSub = false;notify();System.out.println(“SubProcedure ” + i);} public synchronized void addSubProcedure(){
if(!shouldBeSub){
try { wait();public ManageProcedure(int subTimes, int mainTimes){
} shouldBeSub = true;this.subTimes = subTimes;this.mainTimes = mainTimes;private boolean shouldBeSub;private int subTimes, mainTimes;} catch(InterruptedException e){
}
} catch(InterruptedException e){
} } } for(int i = 1;i <= mainTimes;++i){ } shouldBeSub = true;notify();System.out.println(“MainProcedure ” + i);package cn.jp.me;
public class SingleProcedure implements Runnable {
@Override public void run(){
if(type.equals(“sub”)){
for(int i = 0;i < times;++i){ } manageProcedure.addSubProcedure();public SingleProcedure(int times, String type,} ManageProcedure manageProcedure){ private int times;private String type;private ManageProcedure manageProcedure;this.times = times;this.type = type;this.manageProcedure = manageProcedure;} else {
for(int i = 0;i < times;++i){ } manageProcedure.addMainProcedure();
} } } package cn.jp.me;
import java.util.Scanner;
public class Text {
} } subThread.start();mainThread.start();Thread subThread = new Thread(subProcedure);Thread mainThread = new Thread(mainProcedure);
ManageProcedure manageProcedure = new ManageProcedure(subTimes, mainTimes);public static void main(String[] args){
int subTimes, mainTimes, totalTimes;Scanner scanner = new Scanner(System.in);System.out.println(“Please Input The SubTimes && MainTimes && The Total Times”);subTimes = scanner.nextInt();mainTimes = scanner.nextInt();totalTimes = scanner.nextInt();SingleProcedure subProcedure = new SingleProcedure(totalTimes, “sub”, manageProcedure);SingleProcedure mainProcedure = new SingleProcedure(totalTimes, “main”, manageProcedure);
实验题2 设计4个线程,其中2个线程每次对count增加1,另外两个线程每次对count减1。
package cn.jp.me;
public class SingleProcedure implements Runnable {
public synchronized void run(){
if(type.equals(“Add”)){ for(int i = 0;i < times;++i){ manageProcedure.add();public SingleProcedure(int runTimes, String typeString,} ManageProcedure manageProcedure){ this.times = runTimes;type = typeString;this.manageProcedure = manageProcedure;private int times;private String type;private ManageProcedure manageProcedure;
}
}
} } for(int i = 0;i < times;++i){ } manageProcedure.substract();} else { package cn.jp.me;public class ManageProcedure {
} package cn.jp.me.text;
import cn.jp.me.ManageProcedure;import cn.jp.jme.SingleProcedure;
public class Text {
Thread addOne = new Thread(singleAdd);public static void main(String[] args){
ManageProcedure manageProcedure = new ManageProcedure();SingleProcedure singleAdd = new SingleProcedure(100 / 2, “Add”, manageProcedure);100 / 2, “substract”, manageProcedure);SingleProcedure singleSubstract = new SingleProcedure(public int getCount(){ } return count;public synchronized void substract(){
}--count;System.out.println(“Thread ” + Thread.currentThread().getName()+ “The Count : ” + getCount());public synchronized void add(){
} ++count;System.out.println(“Thread ” + Thread.currentThread().getName()+ “The Count : ” + getCount());public ManageProcedure(){ } count = 0;private int count;
}
} addOne.setName(“Add One Thread”);Thread addTwo = new Thread(singleAdd);addTwo.setName(“Add Two Thread”);Thread substractOne = new Thread(singleSubstract);substractOne.setName(“Substract One Thread”);Thread substractTwo = new Thread(singleSubstract);substractTwo.setName(“Substract Two Thread”);addOne.start();addTwo.start();substractOne.start();substractTwo.start();
实验题3 CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier。
题目要求:
(1)要在公司大厅集合、然后参观陈云故居;
(2)参观完后集合、准备去淀水湖参观(有3辆车、对应3个线程);
说明:必须等大家都到齐了才能去下个地方、比如说在公司集合、3辆车子都到了才能出发等。要求:用java线程并发库的CyclicBarrier类模拟上述参观过程。
package cn.jp.me;
import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;
public class SingleProcedure implements Runnable {
@Override public void run(){
System.out.println(“ ” + Thread.currentThread().getName()+ “arrives DaTingn And Start Waitting”);public SingleProcedure(CyclicBarrier barrier){ } this.barrier = barrier;private CyclicBarrier barrier;try { barrier.await();} catch(InterruptedException | BrokenBarrierException e){ } System.out.println(“ ” + Thread.currentThread().getName()e.printStackTrace();
}
}
+ “arrives ChenYunGuJunAnd Start Waitting”);try { barrier.await();} catch(InterruptedException | BrokenBarrierException e){ } e.printStackTrace();package cn.jp.me.text;
import java.util.concurrent.CyclicBarrier;
import cn.jp.me.SingleProcedure;
public class Text {
busOne.start();busTwo.start();busThree.start();
Thread busOne = new Thread(component);busOne.setName(“BusOne”);Thread busTwo = new Thread(component);busTwo.setName(“BusTwo”);Thread busThree = new Thread(component);busThree.setName(“BusThree”);
@Override public void run(){ } System.out.println(“All are arrived and Start to next place”);public static void main(String[] args){ CyclicBarrier barrier = new CyclicBarrier(3, new Runnable(){ });SingleProcedure component = new SingleProcedure(barrier);
} }
实验题4 某图书馆邀请一著名作家签名售书,大家去买书,具体情况如下:
(1)买书的读者很多必须排队,作家签好名的书不多(但是他还会看书的销售的情况,一般满了10本(假设)就不会再签了);
(2)有的书还没有签名,这样排在前面的同学就可以买到书、排在后面的就必须等有了签过名的书才能买;
(3)已经签好名的书可以放在ArrayBlockingQueue中,签好名的书不断的向这个队列里放,而买书的读者不断的从里面取书,如没有签名的书,就必须等,书有10本了,作家就停下来休息。买书的每个读者都可以看作一个线程、作家签名也可以看作是一个线程;
(4)排在前面的读者先买。要求:编写程序,模拟上述过程。
package cn.jp.me;
public class Author implements Runnable {
public Author(CommonData data){ } this.data = data;private CommonData data;
}
package cn.jp.me;
public class Reader implements Runnable {
@Override public void run(){
for(int i = 0;i < data.getTimes();++i){
try { buyABook();} catch(InterruptedException e){ public Reader(CommonData data){ } this.data = data;private CommonData data;private void SignABook()throws InterruptedException {
} while(data.getNumber()== 10){
} data.setSign(data.getSign()+ 1);;System.out.println(“The Author Sign NO.” + data.getSign()+ “ book”);data.put(“The Author Sign No.” + data.getSign()+ “Book”);System.out.println(“There Are ” + data.getNumber()+ “Books Signed”);while(data.getNumber()== 10){
} System.out.println(“There Are 10 Books.The Author Chould Rest A While”);Thread.sleep(4000);System.out.println(“There Are 10 Books.The Author Chould Rest A While”);Thread.sleep(4000);} @Override public void run(){
for(int i = 0;i < data.getTimes();++i){
} try {
} SignABook();e.printStackTrace();} catch(InterruptedException e){
}
}
} } e.printStackTrace();private void buyABook()throws InterruptedException {
} while(data.getNumber()== 0){
} data.setBuy(data.getBuy()+ 1);System.out.println(“Buy The No.” + data.getBuy()+ “ Book”);System.out.println(data.getFirBook()+ “Be Bought”);System.out.println(“There Are ” + data.getNumber()+ “Books Signed”);while(data.getNumber()== 0){
} System.out.println(“There Does Not Exist Books Signed.Must Wait……”);Thread.sleep(3000);System.out.println(“There Does Not Exist Books Signed.Must Wait……”);Thread.sleep(3000);package cn.jp.me;
import java.util.concurrent.ArrayBlockingQueue;
public class CommonData {
public String getFirBook()throws InterruptedException { } return queue.take();public int getNumber(){ } return queue.size();public CommonData(int times){
} queue = new ArrayBlockingQueue
} public void put(String elem)throws InterruptedException { } public int getTimes(){ } public int getBuy(){ } public void setBuy(int buy){ } public int getSign(){ } public void setSign(int sign){ } this.sign = sign;return sign;this.buy = buy;return buy;return times;queue.put(elem);package cn.jp.me;
public class Text {
} public static void main(String[] args){
} CommonData data = new CommonData(100);Author author = new Author(data);Reader reader = new Reader(data);new Thread(author).start();new Thread(reader).start();
实验题5模拟拥有一定数量账户的银行,把随机产生的钱在不同账号之间进行转移交易。每个账号都有一个线程,在每笔交易中,都会从线程所服务的账户中随机取出一定数额的钱转移到另一个随机账户中。
提示: 设计一个Bank类,它有一个transfer方法,该方法将一定数额的钱从一个账户转移到另一个账户,如源账户没有足够余额,该方法直接返回。
package cn.jp.me;
import java.text.Normalizer.Form;
public class Bank {
}
package cn.jp.me;public int getTotalAccountNum(){ } return totalAccountNum;public void setBalance(int accountNo, int num){ } balance[accountNo] = num;public synchronized void transfer(int from, int to, int amount){
} System.out.println(“The Change From ” + from + “ To ” + to);if(balance[from] >= amount){
} System.out.println();System.out.println(“Before Transfer The Balance Of ” + from + “ : ” + balance[from] + “;Of ” + to + “ : ” + balance[to]);System.out.println(“The Change Amount : ” + amount);balance[from]-= amount;balance[to] += amount;System.out.println(“After Transfer The Balance Of ” + from + “ : ” + balance[from] + “;Of ” + to + “ : ” + balance[to]);public Bank(int accountNum){
} totalAccountNum = accountNum;balance = new int[accountNum + 1];private int totalAccountNum;private int[] balance;} else { System.out.println(“The Account ” + from + “'s Balance Is Not Enough”);
import java.util.Random;
import javax.security.auth.login.AccountException;
public class Account implements Runnable {
} package cn.jp.me;
import java.util.Random;import java.util.Scanner;
public class Text {
} Bank bank = new Bank(accountNum);for(int i = 1;i <= accountNum;++i){
} new Thread(new Account(i, random.nextInt(1000000)+ 0, bank)).start();
System.out.println(“Please Input The Number Of Account You Want To Imitate :”);accountNum = scanner.nextInt();public static void main(String[] args){
Random random = new Random();int accountNum;Scanner scanner = new Scanner(System.in);} bank.transfer(accountNo, to, changeNum);@Override public synchronized void run(){ to = random.nextInt(bank.getTotalAccountNum()+ 1);changeNum = random.nextInt(1000000)+ 0;public Account(int accountNo, int initialValue, Bank bank){
} this.accountNo = accountNo;this.bank = bank;bank.setBalance(accountNo, initialValue);private int accountNo;private Bank bank;private static Random random = new Random();int to, changeNum;}
第四篇:指导书_实验二+计算机网络及internet应用
实验二计算机网络及Internet应用
[实验目的]了解计算机网络的基本原理和应用;学习建立FTP服务器和WEB服务器;了解HTML静态网页的基本建立方法。
[实验环境]IIS、IE、Dreamweaver CS
[实验内容]
1、在CMD窗口中运行以下常用网络命令,并观察显示结果:
(1)Ipconfig /all---查看本机网络配置
(2)Ping.cn---查看跟踪路由信息
2、安装配置IIS,建立本地站点。
3、自建简单HTML网页(不少于3个),并对网站进行测试。
Dreamweaver CS6 可在10.2.132.70本课程平台中下载。
实验要求:压缩打包提交网站目录(含HTML网页文件及网页素材)。
提交方法:登录http://10.2.132.70-----课程任务-----提交。
第五篇:逆向工程技术及应用实验指导书
《逆向工程技术及应用》
实验指导书
何照荣 铁永亮 著
广东石油化工学院 机电工程学院
2009 实验一 物体三维尺寸数据采集实验
一、实验目的
1、通过实验了解逆向工程中原始数据的采集方法和应注意的问题;
2、了解三维结构光扫描装置的基本操作和相关知识元;
3、了解Geomagic和TN-3Doms软件的基本操作。
二、实验设备
1、三维结构光扫描装置1台;
2、齿轮、烟灰缸、传动零件若干;
3、Geomagic 11.0软件1套;
4、TN-3DOMS软件1套。
三、相关知识 TN 3DOMS.S 采用非接触式光学扫描,除了覆盖接触式扫描的适用范围之外,还可以用于柔软的、易碎的,以及难于接触的物体的扫描场合。高速的扫描使得用户在很短时间内得到所需的数据,大大缩短了产品造型的开发周期。三维光学扫描仪与普通的扫描仪不同之处在于它记录的是被测物体的所有表面的三维坐标信息。TN 3DOMS.S 可以广泛地应用于模具设计、零配件设计加工、逆向工程、实体测量、质量检测和控制,广告动画设计、文物复制和修复、医学研究等多项领域。
技术特点(1)面扫描 采用独特的照相式原理,在瞬间获得整个物体表面的三维数据,每次扫描一个面,效率极高。(2)精度高 利用独特的测量技术,可获得非常高的测量精度。
(3)速度极快 单面扫描时间3s~20s。
(4)便携式设计 可灵活地移动扫描仪来进行测量,特别适合对大型或重型物体的测量,且硬件设备占地少,受环境因素制约少。(5)非接触扫描 用于柔软、易变形的物体的测量,适用范围非常广泛。
(6)对环境条件不敏感 环境光对该扫描仪的影响极小,相对其他光学式扫描系统而言,该系统不需要在暗室中操作,适用环境范围非广泛,可以在露天环境进行扫描。(7)测量输出数据接口广泛 三维光学扫描仪测量所得为点云数据,该数据可保存为ASC 格式以及WRL(可存储彩色信息)格式,可以直接与Geomagic、CATIA、UG 等软件交换数据。(8)操作软件界面友好 三维光学扫描仪高度集成和智能化的设计,使用户不需过多的培训就可以熟练操作,软件操作简单、快捷易学。
四、实验步骤
三维光学测量系统测量流程如下:
1、软件主界面
TN-3DOMS的软件界面如下图:
2、工程文件
2.1 单击“文件>新项目”菜单,执行“新项目”命令,可以创建一个新工程。2.2 打开项目 单击“文件>打开项目”菜单,执行打开工程命令,在本软件中,通过打开工程命令,可以将工程所在文件夹下不同编码的图片数据处理成三维的点云数据,并载入到工程中。2.3 保存当前项目 单击“文件>保存当前项目”菜单,执行保存命令,在本软件中,通过保存命令,您可以保存当前的测量项目,包括图片信息。2.4 载入数据 单击“文件>载入数据”菜单,可以载入“*.asc”点云格式的文件,进行查看。2.5 导入 单击“文件>导入”菜单,可导入的数据格式有“*.asc,wrl2.0,iges,stl”,以及标定数据等。2.6 导出 单击“文件>导出”菜单,可导出的数据格式有“*.asc,wrl2.0,iges,stl”以及标定数据等。2.7 退出 单击“文件>退出”菜单,执行退出命令,退出软件的运行。
3、测量 3.1 开始测量 单击“测量>开始测量”菜单,设备开始扫描或直接点击
或。
3.2 插入测量 单击“测量>插入测量”菜单,插入一个新的工程项目。
3.3 删除测量 单击“测量>删除测量”菜单,删除一个工程项目。
3.4 属性 单击“测量>属性”菜单,如图示:
“当前信息”显示出当前测量工程的相关信息; “方法”命令可以修改测量方法,采样等参数;
测量质量:
高速度:采用格雷码加相移方式测量,测量速度比较快,点云平滑; 高质量:采用多频外差方式测量,测量质量比较高,小特征细节明显。“类型”命令可以更改测量类型等参数,“系数”命令可以修正扫描误差,一般情况下不需改动。
4、点云数据 扫描部件如图。扫描部件前需对部件进行预处理,包括清洗表面锈迹、污渍等,然后使用DPT-5显像剂对其进行喷涂,保证表面漫反射。
扫描完成后,获得点云数据,将点云数据另存为asc格式文件,用Geomaic打开,如下图:
通过Geomagic软件对点云数据进行降噪、平滑、修补等处理后,获得较好的曲面质量,如下图,五、实验报告
1、简述三维扫描过程,和需要注意的问题;
2、对本实验系统的组成、基本工作原理等做简要叙述。实验二 快速成型技术原理实验
一、实验目的
1、了解快速成型的原理及其与传统加工工艺的区别;
2、了解不同快速成型方式的优点、缺陷和应用范围
二、实验设备
1、计算机2台;
2、Dimension BST-1200es快速成型机1台;
三、快速成型的原理
快速成形(Rapid Prototyping,简称RP)是80年代末期开始商品化的一种高新制造技术,是一种集计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机数字控制(CNC)、激光、精密伺服驱动、新材料等先进技术于一体的加工方法。
快速成形的加工原理是依据计算机设计的三维模型,设计软件可以是常用的CAD软件,例如SolidWorks、Pro/E、UG、CATIA、CAXA等。也可以是通过逆向工程获得的计算机3D模型。如图所示:
图 1 CAD模型
然后把CAD模型转化为快速成形的通用格式stl格式,这是一种三角形文件,它的原理是利用一系列的小三角形平面来逼近自由曲面,其中每个三角形用3个顶点坐标(X、Y、Z)和1个法向量(N)来描述。三角形的大小可以选择,从而得到不同的曲面拟合精度。如图 所示:
图 2 转化为stl三角形文件
然后把STL文件输入到快速成形的控制软件中,如图所示:
图 3 把stl模型输入快速成形处理软件
最后由快速成形相关软件对模型进行分层切片,得到了各层的二维截面轮廓,使用特殊的加工方式把这些截面按顺序一层一层成形,最终叠加成三维工件实物。通常每层的厚度是0.088~0.225mm。如图所示:
图 4 分层并加工相应的二维轮廓
快速成形采用了“层叠增长”的加工方式,和传统的“清除材料”的加工方式相反。它是一种理论上无废料的成形方法。快速成形具有如下的优点: 1.成形速度快
快速成形的层叠增长成形原理将复杂的三维加工分解为简单的二维加工组合,这个它不必采用传统加工工艺的需要的机床、模具等,加工时间快,只需传统加工方法的10%~30%的工时和20%~35%的成本。2.可以成形复杂的三维模型
传统加工工艺收到机床、工种的限制,能够加工出的工件的形状收到一定的限制,对于造型复杂的工件难以完整加工。快速成形采用层叠增长的方式,只要模型的尺寸不要过大、不要过于细小,就可以加工出来,无论多复杂的模型都可以。
根据快速成型的基本原理,现代快速成形机的发展很快,实现手段多种多样,下面介绍5种最主流的快速成型设备。
1)液态光敏聚合物选择性固化(SLA)成形机
这是一种最早出现的商品化快速成形机,它是使用光敏聚合物作为成形材料,加工时激光束照射在液槽的液态光敏聚合物的上表面,并沿着此面做X-Y方向的扫描运动。这一层收到紫外激光束的照射部位的液态光敏聚合物快速凝固,形成了相应的一层固态截面轮廓。
液态光敏聚合物常用的有:环氧树脂、丙烯酸树脂等。经过适当波长的紫外激光照射后,它们会发生聚合反映,迅速固化。
2)丝状材料选择性熔覆(FDM)成形机
FDM的加工原材料是丝状热塑性材料(如ABS、MABS、蜡丝、尼龙丝等),加工时加热喷头在计算机的控制下,可根据截面轮廓信息,做X-Y平面的运动和高度Z方向的运动。丝状热塑性材料由供丝机构送至喷头,并在碰头加热至熔融状态,然后杯选择性地涂覆在工作台上,快速冷却后形成了截面轮廓。一层成形完成后,喷头上升一个截面层高度,再进行第二层的涂覆,如此循环,最终形成三维产品。
3)粉末材料选择性烧结(SLS)成形机
SLS成形机采用CO2(或Nd:YAG激光器)和粉末状材料(如尼龙粉、聚碳酸酯粉等),成形时现在工作台用昆筒铺一层粉末材料,将其加热到略低于它的熔化温度,然后激光束在计算机的控制下按照截面轮廓的信息,对之间的实心部分所在的粉末进行扫描,使粉末温度升至熔点,于是粉末颗粒的交界处熔化,粉末相互粘结,逐步得到各层轮廓。一层完成后,工作台下降一个截面层的高度,再进行下一层的铺料和烧结,如此循环,最终得到三维工件实物。
4)薄形材料选择性切割(LOM)成形机
LOM成形机采用的原材料是地面有热溶胶和添加剂的纸,工作时纸张逐步传送到工作台上方,热粘机构将一层一层的材料粘结再一起。激光切割系统按照计算机提取的横截面轮廓现运动,逐一再工作台上方切割出轮廓线,并将无轮廓区域切割成小方格,这是为了方便成形后能清除废料。可升降工作台支撑正在成形的工件,每层成形之后工作台下降一个材料厚度的高度。
LOM快速成形机制作精度高,制件能承受200度,有比较高的硬度和较好的机械性能,可以进行切削加工。它无需设计和制作支撑结构,制件的尺寸打,原材料便宜。但是这种成形发发不能直接制作塑料工件,抗拉强度和弹性不够好,工件容易吸湿膨胀,工件表面有台阶纹。
5)立体打印机(3D Printer)
三维打印软件把三维CAD软件设计的模型转化为横截面切片,打印每层厚度可以是0.0762~0.2286mm。接着三维打印机把这些横截面切片按照从底到上的次序一层一层依次打印。
五、实验内容
(1)学习快速成型的基本原理。
(2)使用自己熟悉的三维CAD软件(如SolidWorks、Pro/E、UG、CAXA等)设计一个作品,并在FDM设备上获得该作品的快速成型件。(3)结合快速成型件观察不同成型方式的优、缺点。