实验6JavaAWT及Swing应用_swing实验
实验6JavaAWT及Swing应用由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“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 cla 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 和 JPawordField 在使用中的异同;
(3)初步了解和运用事件处理机制和 Action 事件的处理。
实验任务:
编写一个 Java 程序 , 实现用户根据自己的密码进入界面, 如果用户输入信息正确 , 则输出 “ 欢迎×××u29992X户 ”, 否则用户还可以尝试两次 , 如果尝试阶段输入信息错误, 则输出 “ 请输入正确的信息 ”, 如果尝试失败 , 用户则退出。
实验步骤 :
打开 Eclipse, 打开一个已有项目如 Chapter3, 在该项目下完成如下练习。
练习: 密码验证
要求: 在当前项目如Chapter3下, 新建一个文件PawordVerification.java, 将程序清单 3-2 中的程序输入并保存。要求该程序完成如下功能 : 用户根据自己的密码进入界面 , 如果用户输入信息正确 , 则输出 “ 欢迎××× ”, 否则用户还可以尝试两次 , 如果尝试阶段输入信息错误 , 则输出 “请输入正确的信息” , 如果尝试失败 , 用户则退出。调试并编译程序 PawordVerification.java, 运行该程序 , 运行结果如图2、图 3和图 4所示 , 请将该程序中的代码1~代码7补充完整。
图2
图3 3
图4 程序清单 3-2 PawordVerification.java //PawordVerification.java import javax.swing.*;import java.awt.event.*;
import java.awt.*;public cla PawordVerification extends JFrame implements ActionListener{ JLabel userLabel;//定义用户标签提示
JLabel pawordLabel;//定义密码标签提示
JTextField userText;//定义用户文本框
JPawordField pawordText;//定义密码文本框
int count=1;//统计输入信息的次数
public PawordVerification(){ super(”请输入信息“);
Container container=getContentPane();//得到容器对象container;
container.setLayout(new FlowLayout());//设置默认布局
userLabel=new JLabel(”用户名“);//创建用户标签
pawordLabel=new JLabel(”密 码“);//创建密码标签
userText=new JTextField();//创建用户文本输入框
pawordText=new JPawordField();//创建密码输入文本框
pawordText.addActionListener(this);//注册事件监听者;container.add(userLabel);container.add(userText);container.add(pawordLabel);container.add(pawordText);setSize(240,100);setVisible(true);
}
public void actionPerformed(ActionEvent e){//事件处理
String userName=new String(”陈三“);//假设为正确的用户名;String paword=new String(”12345678“);//假设为正确的密码;
if(e.getSource()==pawordText){ count++;
char[] pawords=pawordText.getPaword();
if(userText.getText().equals(userName)&&paword.equals(new String(pawords))){
JOptionPane.showMeageDialog(null, ”欢迎您:“ + userName);
System.exit(0);
}
else if(count>3)System.exit(0);else{
JOptionPane.showMeageDialog(null,userText.getText()+”请输入正确信息“);} } }
public static void main(String args[]){
PawordVerification pv=new PawordVerification();pv.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} 思考
(1)程序 PawordVerification.java 中第 3 行语句 java.awt.* 的作用是什么 ? 引入java.awt包中所有的类。
(2)程序 actionPerformed()方法中 if(e.getSource()==pawordText)的作用是什么 ? 如果去掉该条件判断 , 程序运行结果会发生什么变化 ?
该语句的作用是判断事件源是否为pawordText。去掉该条件判断,程序运行结果无变化。(3)观察程序actionperformed()方法中语句”char[]pawords =pawordText.getPaword();“的作用是什么 ?
从密码文本框获取密码,并将其存入pawords数组中。
(4)观 察 程 序 中 定 义 的main()方 法, 如 果 在PawordVerification pv=new pawordverification();语句后 , 添加语句 System.exit(0), 会出现什么问题 , 为什么 ?
程序被终止运行,因为该语句的作用是终止当前正在运行的 Java 虚拟机。
(5)从给定程序的运行结果看 , 密码输入的回显字符是 ”*“, 如果把回显字符换成”#“, 该如何处理 ?
在构造函数中添加pawordText.setEchoChar('#');语句。
(6)如果要求在信息输入错误处理中 , 一旦输入完密码信息 , 用户输入框和密码输入框可以清空 , 请将上述程序修改 , 使之实现该功能。
在最后一个else中添加以下代码:userText.setText(”“);
pawordText.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 cla CardManager extends JFrame{
JLabel nameLabel,sexLabel,titleLabel,unitLabel;
JLabel addreLabel,telLabel1,telLabel2,mobileLabel,faxLabel,emailLabel;JTextField nameTxt,unitTxt,addreTxt;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);
addreLabel=new JLabel(”工作地址“);//定义工作地址标签
addreTxt=new JTextField(30);//定义工作地址输入框
centerPanel.add(addreLabel);centerPanel.add(addreTxt);
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 cla 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
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