高级java实验报告GUI设计.docx
《高级java实验报告GUI设计.docx》由会员分享,可在线阅读,更多相关《高级java实验报告GUI设计.docx(25页珍藏版)》请在冰豆网上搜索。
高级java实验报告GUI设计
实验报告
课程名称高级java程序设计
实验项目实验3Java高级GUI
实验仪器
系别计算机学院
专业软件工程
班级/学号
实验日期
成绩
指导教师
【实验名称】实验3Java高级GUI
【实验目标】1、学习和掌握JavaBeans的基本实现方法和应用情形。
2、学习和掌握MVC模式以及实现方法。
3、学习和了解Java提供的各种容器、组件及其应用效果。
【实验日期和时间记录】实验日期12月
【实验预习】1、学习和掌握基本程序的结构和实现方法。
2、学习和掌握JavaBeans和MVC的基本概念和实现方法。
3、在基本程序的基础上,使用新的技术,实现更复杂的程序
【实验过程及结果记录】
1、(信息面板MessagePanel触发事件ActionEvent)在程序清单15.7-.8中(上册P414-418,“15.9实例学习:
MessagePanel类”一节),信息面板类MessagePanel是JPanel类的一个类,它可以触发事件MouseEvent、KeyEvent和ComponentEvent,但不能触发ActionEvent。
修改MessagePanel类,使得单击它的实例时能够触发ActionEvent事件。
将新类命名为MessagePanelWithActionEvent。
使用一个Applet来测试该类,单击信息面板时在其中显示当前时间
实验结果:
2、(修改CircleController)根据程序清单35.1-35.4,
CircleController用文本域获取新的半径,用组合框获取表明圆是
否是实心的布尔值。
在CircleController中加入一行,使用户可以
用JColorChooser组件选择颜色,如图3.2所示。
新的行包括写有文本Color的标签,要显示颜色的标签和一个省略号按钮。
用户可以通过单击省略号按钮来显示JColorChooser对话框。
一旦用户选择了颜色,颜色便显示在省略号按钮左边面板的背景上。
说明:
程序实现的基本思路和方法。
(1)学习程序清单35.1-35.4,MVC程序的构造以及测试方法。
(2)对CircleController(程序清单35.3P402)进行相应的
修改,包括:
静态GUI的修改,增加颜色控制组件;动态事件处理
的修改,增加对颜色控制按钮的事件处理,弹出颜色选择对话框,
选择颜色,使用该颜色设置颜色标签,反映颜色变化。
(3)对CircleController进行修改,在颜色控制按钮的事件
处理中,使用控制器得到的用户颜色,修改对应的CircleModel对
象的颜色属性设置。
(4)运行程序,启动用户测试程序MVCDemo.java(程序清单
35.4,教材P403),分别打开控制器和视图,观察控制器是如何控
制视图变化的。
实验结果
【实验总结】
对于自身薄弱的GUI知识有了进一步的理解,对于如何实现逻辑功能与界面结合有了自己的一套方法。
并能利用javabeans和mvc解决一些问题。
【思考题的思考】
【思考题】
1、JavaBeans的基本结构要求有哪些?
MessagePanel是
JavaBeans组件(类)吗?
什么是源组件?
MessagePanel是源组件吗?
JavaBeans一定是源组件吗?
反之,源组件一定是JavaBeans吗?
JavaGUI组件是JavaBeans吗?
是源组件吗?
答:
bean必须是公共类,尽管bean可能有其他的构造方法,但是必要时必须有一个公共的无参构造方法,bean必须实现java.io.Serializable,以确保其持续性。
等等;不是;源组件包含用于检测引发事件外部或内部动作的代码。
不是;不一定;不是;不是;不是;
2、如何创建一个自定义的源组件?
答:
先定义事件接口——》检测事件——》通过调用向量中每个监听器的事件处理器来出发和处理事件
3、在练习2的MVC实现中,Controller如何从用户获得信息、
修改Model?
Model是如何将状态变化通知给View?
View是如何根据Model变化来进行相应地显示的?
这个MVC的起点在哪里?
答:
jtfRadius.getText()).doubleValue()从输入中获取。
然后修改model.setFilled(
((Boolean)jcbFilled.getSelectedItem()).booleanValue()。
通知给view:
if(model.isFilled())
{
g.fillOval(xCenter-radius,yCenter-radius,2*radius,2*radius);
}
else
{
g.drawOval(xCenter-radius,yCenter-radius,2*radius,2*radius);
}
【附:
程序代码】
习题1:
MessagePanelWithActionListener类:
packagesy3;
importjava.awt.Dimension;
importjava.awt.FontMetrics;
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.util.ArrayList;
importjavax.swing.JPanel;
publicclassMessagePanelWithActionListenerextendsJPanelimplementsMouseListener
{
privateStringmessage="WelcometoJava";
privateintxCoordinate=20;
privateintyCoordinate=20;
privatebooleancentered;
privateintinterval=10;
privateArrayListactionListenerList;
publicMessagePanelWithActionListener()
{
this.addMouseListener(this);
}
publicMessagePanelWithActionListener(Stringmessage)
{
this.message=message;
this.addMouseListener(this);
}
publicvoidsetMessage(Stringmessage)
{
this.message=message;
repaint();
}
publicintgetXCoordinate()
{
returnxCoordinate;
}
publicintgetYCoordinate()
{
returnyCoordinate;
}
publicvoidsetXCoordinate(intx)
{
this.xCoordinate=x;
repaint();
}
publicvoidsetYcoordinate(inty)
{
this.yCoordinate=y;
repaint();
}
publicbooleanisCentered()
{
returncentered;
}
publicvoidsetCentered(booleancentered)
{
this.centered=centered;
repaint();
}
publicintgetInterval()
{
returninterval;
}
publicvoidsetInterval(intinterval)
{
this.interval=interval;
}
protectedvoidpaintComponent(Graphicsg)
{
super.paintComponent(g);
if(centered)
{
FontMetricsfm=g.getFontMetrics();
intstringWidth=fm.stringWidth(message);
intstringAscent=fm.getAscent();
xCoordinate=getWidth()/2-stringWidth/2;
yCoordinate=getHeight()/2-stringAscent/2;
}
g.drawString(message,xCoordinate,yCoordinate);
}
publicvoidmoveLeft()
{
xCoordinate-=interval;
repaint();
}
publicvoidmoveRight()
{
xCoordinate+=interval;
repaint();
}
publicvoidmoveUp()
{
yCoordinate-=interval;
repaint();
}
publicvoidmoveDown()
{
yCoordinate+=interval;
repaint();
}
publicDimensiongetPreferredSize()
{
returnnewDimension(200,30);
}
publicsynchronizedvoidaddActionListener(ActionListenerlistener)
{
if(actionListenerList==null)
{
actionListenerList=newArrayList
(2);
}
if(!
actionListenerList.contains(listener))
{
actionListenerList.add(listener);
}
}
publicsynchronizedvoidremoveActionListener(ActionListenerlistener)
{
if(actionListenerList!
=null&&actionListenerList.contains(listener))
{
actionListenerList.remove(listener);
}
}
publicvoidmouseClicked(MouseEvente){
//TODOAuto-generatedmethodstub
processEvent(newActionEvent(this,ActionEvent.ACTION_PERFORMED,null));
}
publicvoidmousePressed(MouseEvente){
//TODOAuto-generatedmethodstub
}
publicvoidmouseReleased(MouseEvente){
//TODOAuto-generatedmethodstub
}
publicvoidmouseEntered(MouseEvente){
//TODOAuto-generatedmethodstub
}
publicvoidmouseExited(MouseEvente){
//TODOAuto-generatedmethodstub
}
privatevoidprocessEvent(ActionEvente)
{
ArrayListlist;
synchronized(this)
{
if(actionListenerList==null)
{
return;
}
list=(ArrayList)actionListenerList.clone();
}
for(inti=0;i{
ActionListenerlistener=(ActionListener)list.get(i);
listener.actionPerformed(e);
}
}
}
TestMessagePanelWithMouseListener类:
packagesy3;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.*;
importjavax.swing.JApplet;
publicclassTestMessagePanelWithMouseListenerextendsJApplet{
privateMessagePanelWithActionListenermessagePanel=newMessagePanelWithActionListener();
publicTestMessagePanelWithMouseListener()
{
this.add(messagePanel);
messagePanel.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente)
{
messagePanel.setCentered(true);
messagePanel.setMessage(newjava.util.Date().toString());
}
});
}
publicstaticvoidmain(String[]args)
{
JAppletapplet=newTestMessagePanelWithMouseListener();
JFrameframe=newJFrame("TestMessagePanelWithMouseListener");
frame.add(applet);
frame.setSize(300,200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
习题2:
CircleModel类:
packagesy3;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.ArrayList;
publicclassCircleModel{
privatedoubleradius=20;
privatebooleanfilled;
privatejava.awt.Colorcolor;
privateArrayListactionListenerList;
publicdoublegetRadius()
{
returnradius;
}
publicvoidsetRadius(doubleradius)
{
this.radius=radius;
processEvent(newActionEvent(this,ActionEvent.ACTION_PERFORMED,"radius"));
}
publicbooleanisFilled()
{
returnfilled;
}
publicvoidsetFilled(booleanfilled)
{
this.filled=filled;
processEvent(newActionEvent(this,ActionEvent.ACTION_PERFORMED,"filled"));
}
publicjava.awt.ColorgetColor()
{
returncolor;
}
publicvoidsetColor(java.awt.Colorcolor)
{
this.color=color;
processEvent(newActionEvent(this,ActionEvent.ACTION_PERFORMED,"color"));
}
publicsynchronizedvoidaddActionListener(ActionListenerl)
{
if(actionListenerList==null)
{
actionListenerList=newArrayList();
}
actionListenerList.add(l);
}
publicsynchronizedvoidremoveActionListener(ActionListenerl)
{
if(actionListenerList!
=null&&actionListenerList.contains(l))
{
actionListenerList.remove(l);
}
}
privatevoidprocessEvent(ActionEvente)
{
ArrayListlist;
synchronized(this)
{
if(actionListenerList==null)
{
return;
}
list=(ArrayList)actionListenerList.clone();
}
for(inti=0;i{
ActionListenerlistener=(ActionListener)list.get(i);
listener.actionPerformed(e);
}
}
}
CircleController类:
packagesy3;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.JButton;
importjavax.swing.JColorChooser;
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JTextField;
publicclassCircleControllerextendsJPanel{
privateCircleModelmodel;
privateJTextFieldjtfRadius=newJTextField();
privateJComboBoxjcbFilled=newJComboBox(newBoolean[]{newBoolean(false),newBoolean(true)});
privateJButtonjbColor=newJButton("...");
privateJColorChooserjcc=newJColorChooser();
publicCircleController()
{
JPanelpanel1=newJPanel();
panel1.setLayout(newGridLayout(2,1));
panel1.add(newJLabel("Radius"));
panel1.add(newJLabel("Filled"));
JPanelpanel2=newJPanel();
panel2.setLayout(newGridLayout(2,1));
panel2.add(jtfRadius);
panel2.add(jcbFilled);
JPanelpanel3=newJPanel();
finalJPanelpanelColor=newJPanel();
panel3.setLayout(newGridLayout(1,3));
panel3.add(newJLabel("Color"));
panel3.add(panelColor);
panel3.add(jbColor);
setLayout(newBorderLayout());