实验2 面向对象d图形与e事件驱动.docx
- 文档编号:25196616
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:16
- 大小:32.74KB
实验2 面向对象d图形与e事件驱动.docx
《实验2 面向对象d图形与e事件驱动.docx》由会员分享,可在线阅读,更多相关《实验2 面向对象d图形与e事件驱动.docx(16页珍藏版)》请在冰豆网上搜索。
实验2面向对象d图形与e事件驱动
实验2面向对象(图形与事件驱动)
Java提供了图形用户界面(GUl)库,以便程序员能方便地构建一个在所有平台上都能正常显示的图形界面。
基础类库AWT和swing就是为此设计的。
本次实验将学习图形用户界面的编写。
一、实验目的1
二、实验要求1
三、实验内容2
1.图形界面外观设计实验2
1.1预备知识2
1.2建立窗口。
运行下面的3个程序,比较它们的区别。
3
1.3框架(窗口)的结构4
1.4向窗口添加组件。
思考退出按钮为何在取消按钮之前。
5
1.5自行编程验证3种布局管理器的特性。
6
1.6编写程序,框架用JFrame;容器用JPanel,有2个;原子组件有3个按钮、2个JLabel。
请用三种布局分别实现。
6
2.绘图实验6
2.1预备知识6
2.2运行下面的程序。
输出结果如下。
分析为什么黑色椭圆比红色椭圆更偏右偏下。
6
2.3编程,实现下图界面。
8
3事件驱动程序设计9
3.1预备知识9
3.1编程实现:
单击按钮,打开文件对话框。
10
3.2命题编程,实现在窗口中用鼠标拖动画线。
12
3.3命题编程,在窗口中画圆,并用键盘方向键移动它,或者用鼠标拖动它。
12
一、实验目的
通过编程和上机实验,验证图形界面的外观构成、绘图、事件驱动。
awt和swing类库中常见类的基本使用;了解绘图方法;理解事件驱动程序设计。
二、实验要求
1、编写程序,验证图形界面的外观构成。
(swing库的框架、容器、组件;并验证3种布局管理器)
2、编写程序,验证绘图方法。
3、编写程序,验证事件驱动程序设计的方法。
(了解图形用户界面的事件响应机制,并能进行常用的事件处理,如按钮事件、键盘事件、窗口事件等)
三、实验内容
1.图形界面外观设计实验
1.1预备知识
● 顶层容器Swing提供三个顶层容器的类
JFrame实现单个主窗口
JDialog实现一个对话框
JApplet在浏览器窗口中实现一个applet显示区域
● 中间层容器:
其存在的目的仅仅是为了容纳别的组件
JPanelJScrollPaneJSplitPaneJTabbedPaneJToolBar
● 原子组件:
通常用来和用户交互,而不像前两种组件那样是用来容纳别的组件的;当然前2组也可以交互。
–根据功能的不同,可被分为三类:
●显示不可编辑信息的JLabel、JProgressBar、JToolTip
●有控制功能、可以用来输入信息的JButton、JCheckBox、JRadioButton、JComboBox、JList、JMenu、JSlider、JSpinner、JTexComponent等
●能提供格式化的信息并允许用户选择的JColorChooser、JFileChooser、JTable、JTree
FlowLayout是JPanel默认使用的布局管理器,它只是简单地把组件放在一行,如果容器不是足够宽来容纳所有组件,就会自动开始新的一行。
组件的大小要看上面文字的长度和字体。
窗口变大,组件不会随着变大。
下面2个布局管理器:
窗口变大,组件会随着变大。
因为每个组件占据一个区域,它会把分给它的区域占满。
GridLayout将按照其构造方法中程序员提供的行数和列数将界面分为等大的若干块,组件被等大地按加载顺序放置其中。
BorderLayout以将组件放置到五个区域:
东、西、南、北、中。
它是JFrame等顶级容器的默认布局管理器。
布局管理器的使用方法是通过调用容器对象的setLayout方法,并以某种布局管理器对象为参数,例如:
假设myFrame是窗口类对象
myFrame.setLayout(newFlowLayout());
1.2建立窗口。
运行下面的3个程序,比较它们的区别。
(1)
importjavax.swing.*;
publicclassTest{
publicstaticvoidmain(String[]args){
JFramef=newJFrame("hello");
f.setVisible(true);
}
}
(2)
importjavax.swing.*;
classMyFrameextendsJFrame{
MyFrame(Strings){
super(s);//或setTitle(s);
setVisible(true);
}
}
publicclassTest{
publicstaticvoidmain(String[]args){
newMyFrame("hello");
}
}
(3)
importjavax.swing.*;
publicclassTestextendsJFrame{
publicstaticvoidmain(String[]args){
Testf=newTest("hello");
f.setVisible(true);
}
Test(Strings){
super(s);//或setTitle(s);
}
}
1.3框架(窗口)的结构
JFrameJDialogJApplet等顶级容器自带一个JRootPane类的对象
JRootPane对象由3个成员组成:
一个Container类的对象ContentPane(内容面板)
一个JMenuBar类的对象【可选】
一个glassPane,捕获鼠标移动等事件
在窗口上添加按钮,实际是添加在内容面板上。
(1)下面的程序,在窗口中添加菜单栏。
importjavax.swing.*;
classMyFrameextendsJFrame{
MyFrame(Strings){
setTitle(s);
JMenumFile,mEdit,mHelp;
mFile=newJMenu("文件");mEdit=newJMenu("编辑");mHelp=newJMenu("帮助");
JMenuItemfileNew,fileOpen;
fileNew=newJMenuItem("新建");fileOpen=newJMenuItem("打开");
mFile.add(fileNew);mFile.add(fileOpen);
JMenuBarmyJMenuBar=newJMenuBar();
myJMenuBar.add(mFile);myJMenuBar.add(mEdit);myJMenuBar.add(mHelp);
setJMenuBar(myJMenuBar);//不要用add方法
setVisible(true);
}
}
publicclassTest{
publicstaticvoidmain(String[]args){
MyFramef=newMyFrame(“菜单栏演示");
f.setBounds(100,100,400,400);
}
}
(2)窗口的客户区被内容面板盖住了。
验证下面的代码。
JFramef=newJFrame("MyFrame");
JLabellb=newJLabel(“Pleaseinputname”);
f.add(lb);等价于f.getRootPane().getContentPane().add(lb);
等价于f.getContentPane().add(lb);
f.setBackground(Color.red);//语法正确,但为什么颜色没有改变?
f.getRootPane().getContentPane().setBackground(Color.red);//可以
f.getContentPane().setBackground(Color.red);//可以
(3)验证下面的代码
f.setBackground(Color.red);
f.getContentPane().setVisible(false);
(4)验证下面的代码
f.setBackground(Color.red);
f.getRootPane().setVisible(false);
1.4向窗口添加组件。
思考退出按钮为何在取消按钮之前。
importjavax.swing.*;
importjava.awt.*;
publicclassMyFrameextendsJFrame{
JButtonbtOK=newJButton("确认");
JButtonbtCancel=newJButton("取消");
JButtonbtExit=newJButton("退出");
MyFrame(Strings){
setTitle(s);
setLayout(newFlowLayout());
add(btOK);//追加到末尾
add(btCancel);//追加到末尾
add(btExit,1);//插入到指定下标处,和ArrayList一样
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setBounds(100,100,400,400);
}
publicstaticvoidmain(String[]args){
newMyFrame("这里是标题栏");
}
}
1.5自行编程验证3种布局管理器的特性。
1.6编写程序,框架用JFrame;容器用JPanel,有2个;原子组件有3个按钮、2个JLabel。
请用三种布局分别实现。
2.绘图实验
2.1预备知识
所有组件都可以用paint(Graphicsg)绘图
组件如果不是JComponent的子类,例如JFrame,只能用paint绘图
对于JComponent的子类组件,例如JPanel,JButton,既可以用paint,也可以用paintComponent。
为效率计,用后者更好。
如果用paint(Graphicsg),调用父类的绘图时,记得也用super.paint(g);
如果用paintComponent(Graphicsg),调用父类的绘图时,记得也用super.paintComponent(g);
2.2运行下面的程序。
输出结果如下。
分析为什么黑色椭圆比红色椭圆更偏右偏下。
importjavax.swing.*;
importjava.awt.*;
classMyPanelextendsJPanel{
protectedvoidpaintComponent(Graphicsg){
super.paintComponent(g);
g.drawOval(30,30,100,50);
}
}
classMyButtonextendsJButton{
protectedvoidpaintComponent(Graphicsg){
super.paintComponent(g);
g.drawOval(30,30,100,50);
}
MyButton(Strings){
super(s);
}
}
publicclassMyFrameextendsJFrame{
MyButtonbtOK=newMyButton("确认");
MyPanelmyPanel=newMyPanel();
MyFrame(Strings){
setContentPane(myPanel);
setTitle(s);
setLayout(null);
btOK.setBounds(100,100,100,100);
btOK.add(newJButton("s"));//按钮btOK里又放一个按钮
add(btOK);//
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setBounds(100,100,400,300);
}
publicvoidpaint(Graphicsg){
super.paint(g);
g.setColor(Color.red);
g.drawOval(30,30,100,50);
}
publicstaticvoidmain(String[]args){
newMyFrame("这里是标题栏");
}
}
2.3编程,实现下图界面。
//用各种颜色绘制文字及各种图形
importjava.awt.*;
importjavax.swing.*;
publicclassE2_3extendsJFrame{
publicE2_3(){
super("演示字体、颜色、绘图");//调用基类构造方法
setSize(480,250);//设置窗口大小
setVisible(true);//显示窗口
}
publicvoidpaint(Graphicsg){
super.paint(g);//callsuperclass'spaintmethod
g.setFont(newFont("SansSerif",Font.BOLD,12));
g.setColor(Color.blue);//设置颜色
g.drawString("字体ScanSerif,粗体,12号,蓝色",20,50);
g.setFont(newFont("Serif",Font.ITALIC,14));
g.setColor(newColor(255,0,0));
g.drawString("字体Serif,斜体,14号,红色",250,50);
g.drawLine(20,60,460,60);//绘制直线
g.setColor(Color.green);
g.drawRect(20,70,100,50);//绘制空心矩形
g.fillRect(130,70,100,50);//绘制实心矩形
g.setColor(Color.yellow);
g.drawRoundRect(240,70,100,50,50,50);//绘制空心圆角矩形
g.fillRoundRect(350,70,100,50,50,50);//绘制实心圆角矩形
g.setColor(Color.cyan);
g.draw3DRect(20,130,100,50,true);//绘制突起效果空心矩形
g.fill3DRect(130,130,100,50,false);//绘制凹陷效果实心矩形
g.setColor(Color.pink);
g.drawOval(240,130,100,50);//绘制空心椭圆
g.fillOval(350,130,100,50);//绘制实心椭圆
g.setColor(newColor(0,120,20));
g.drawArc(20,190,100,50,0,90);//绘制一段圆弧
g.fillArc(130,190,100,50,0,90);//绘制扇形
g.setColor(Color.black);
intxValues[]={250,280,290,300,330,310,320,290,260,270};
intyValues[]={210,210,190,210,210,220,230,220,230,220};
g.drawPolygon(xValues,yValues,10);//绘制空心多边形
intxValues2[]={360,390,400,410,440,420,430,400,370,380};
g.fillPolygon(xValues2,yValues,10);//绘制实心多边形
}
publicstaticvoidmain(Stringargs[]){
E2_3application=newE2_3();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
3事件驱动程序设计
3.1预备知识
(1)事件处理步骤
A.定义类实现事件监听器接口
例如,ActionListener是动作事件监听器接口,定义如下:
interfaceActionListener
{publicabstractvoidactionPerformed(ActionEvente);}
如果名为Myclass的类要处理动作事件,就要定义Myclass类实现ActionListener接口。
要建立处理事件的类,需要说明类实现事件监听器接口,说明格式如下:
publicclass类名implements监听器接口名列表
在实现事件监听器接口的类中为抽象方法编写代码。
例如,在Myclass类中为ActionListener接口的actionPerformed()方法编写语句。
publicvoidactionPerformed(ActionEvente)
{填写处理动作事件的语句}
B.将产生事件的组件注册为事件监听器
如果希望组件产生事件时能够得到响应,应将产生事件的组件注册为事件监听器,注册的语句如下:
组件名.addXXXListener(实现事件监听器接口的类对象);
XXX代表事件类型。
例如,假设Myclass是实现ActionListener接口的类。
将Myclass类对象注册为事件监听器,对应语句如下:
组件名.addActionListener(newMyclass());
也可以使用关键字this。
如,组件名.addActionListener(this)。
(2)鼠标事件和键盘事件的具体处理
vMouseListener接口:
mousePressed(MouseEvente):
鼠标键被按下时调用;
mouseReleased(MouseEvente):
鼠标键被释放时调用;
mouseClicked(MouseEvente):
合并上述两个事件为一次鼠标点击事件;
mouseEntered(MouseEvente):
鼠标进入事件;
mouseExited(MouseEvente):
鼠标离开事件。
getX()和getY()方法:
得到鼠标点击时x和y坐标。
getClickCount()方法:
可以区别单击操作和双击操作。
vMouseMotionListener接口:
mouseMoved(MouseEvente):
鼠标移动;
mouseDragged(MouseEvente):
用户拖动鼠标。
(3)键盘事件
KeyListener接口中有三个方法:
publicvoidkeyPressed(KeyEvente)
publicvoidkeyReleased(KeyEvente)
publicvoidkeyTyped(KeyEvente)
3.1编程实现:
单击按钮,打开文件对话框。
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
classwinextendsJFrame{
staticwinfe=null;
JButtonbt1=newJButton("退出"),
bt2=newJButton("打开文件"),
bt3=newJButton("保存文件");
win(){this("");}
win(Stringstr){
super(str);
setLayout(newFlowLayout());
add(bt1);
add(bt2);
add(bt3);
setSize(200,150);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
MyActionListenerlisten=newMyActionListener();
bt1.addActionListener(listen);
bt2.addActionListener(listen);
bt3.addActionListener(listen);
}
//----------------------------------------------------------
classMyActionListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==bt1){
dispose();
System.exit(0);
}
if(e.getSource()==bt2){
JFileChooserfd1=newJFileChooser("C:
\\");//JFileChooser是新的文件对话框
fd1.showOpenDialog(fe);
}
if(e.getSource()==bt3){
FileDialogfd2=newFileDialog(fe,"请输入保存",FileDialog.SAVE);//FileDialog已过时,你可以查询JFileChooser类,自行修改
fd2.show();
}
}
}
}
//----------------------------------------------------------
publicclassE3_1{//主类
publicstaticvoidmain(Stringargs[]){
winfe=newwin("文件对话框");
win.fe=fe;
fe.setBackground(Color.blue);
}
}
3.2命题编程,实现在窗口中用鼠标拖动画线。
(提示,鼠标的监听接口有2个,MouseListener和MouseMotionListener。
因为鼠标划线涉及到“按”、“放”、“拖动”等事件,其中拖动需要MouseMotionListener
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验2 面向对象d图形与e事件驱动 实验 面向 对象 图形 事件 驱动