组件及事件处理
- 格式:ppt
- 大小:1.64 MB
- 文档页数:66
《Android基础应用》AndroidUI基本控件与事件处理⏹本章任务⏹使用Android开发本息计算器程序⏹使用Android开发华氏-摄氏温度转换器⏹本章目标⏹熟悉掌握本章基本控件的使用⏹熟练掌握Android常用事件1.Android基本控件Android应用开发的一项内容就是用户界面的开发,Android提供了大量功能丰富的UI组件,大部分放在android.widget包及其子包android.view包及其子包在Android当中View类是最基本的一个UI类,基本上所有的高级UI组件都是继承View类而实现的。
如Button(按钮),list(列表),EditText(编辑框),RadioButton(多选按钮),Checkbox(选择框)等都是View类在Android中,我们可以在Xml文件中使用UI组件也可以在java文件中创建UI组件官方建议采用xml方式,这样的话能够实现界面和代码分离1.1TextView和EditTextTextView是一种用于显示字符串的控件EditText则是用来输入和编辑字符串的控件,EditText是一个具有编辑功能的TextViewTextView和EditText基本属性●android:id设置ID,通过编码可以找到这个组件●android:layout_width设置在屏幕上的宽度●android:layout_height设置在屏幕上的高度fill_parent强制性地使构件扩展,以填充布局单元内尽可能多的空间wrap_content强制性地使视图扩展以显示全部内容●android:text设置显示的文本信息●android:textColor设置文本颜色●android:textSize设置文本尺寸示例的现实结果1.2Button和ImageButtonButton是一种按钮控件,用户能够在该控件上点击,并后引发相应的事件处理函数ImageButton用以实现能够显示图像功能的控件按钮示例示例的现实结果1.3CheckBox和RadioButtonCheckBox是一个同时可以选择多个选项的控件RadioButton则是仅可以选择一个选项的控件示例1.4 开发本息计算器界面需求说明银行提供整存整取定期储蓄业务,年利率为(一年 2.25%,两年 2.7%,三年3.24%,五年3.6%),要求输入本金数目和存款年限,计算到期取款时银行应支付本息开发思路开发页面main.xml按效果图进行布局示例练习——开发本息计算器界面2.Android事件处理事件处理的概念任何应用最终都是要面对用户的,经常处理的是用户的动作,也就是说要为用户的动作提供响应,这种为为用户动作提供响应的机制就是事件处理Android提供了强大的事件处理机制基于监听的事件处理●主要就是为Android界面组件绑定特定的事件监听器基于回调的时间处理●主要做法是重写Android组件特定的回调函数,Android大部分界面组件都提供了事件响应的回调函数,我们只要重写它们就行2.1基于监听的事件处理这是更具“面向对象”性质的事件处理方式,与java中的AWT,Swing开发中的处理相同在监听器模型中,主要涉及三类对象事件源Event Source:产生事件的来源,通常是各种组件,如按钮,窗口等事件Event:事件封装了界面组件上发生的特定事件的具体信息,如果监听器需要获取界面组件上所发生事件的相关信息,一般通过事件Event对象来传递 事件监听器Event Listener:负责监听事件源发生的事件,并对不同的事件做相应的处理基于监听器的事件处理机制是一种委派式Delegation的事件处理方式,事件源将整个事件委托给事件监听器,由监听器对事件进行响应处理。
事件处理业务的简易组件编排框架背景很多⼊侵事件类型的处理流程⾮常相似,只有少部分的差异。
按⽬前的⽅式,每种⼊侵事件类型都要开发⼀遍,很多相似的模板代码,可复⽤性和可维护性都⼀般。
这种情况下,可以采⽤业务编排的⽅式,来提升事件处理的可复⽤性和可维护性。
业务的组件编排,意味着需要将业务逻辑抽象成组件,然后将组件编排成业务流程。
基于组件编程思想。
业务的组件编排和⼯作流引擎有点类似。
但我们的⽬标不是实现类似审批、采购这样的流程,⽽是为了让业务逻辑能够更加可复⽤和可扩展,提升研发效率。
因此,最终⽬标不是实现⼀个⼯作流引擎,⽽是实现⼀个相对灵活的业务组件编排和执⾏框架。
⽬标将通⽤和差异分离,最⼤程度复⽤已有逻辑,降低新⼊侵事件处理的开发量,提升其研发效率;业务逻辑组件化,改动只局限在新增的组件,遵循开闭原则,提升软件可维护性。
适⽤场景具有相似性的模板流程的事件处理。
设计思路要设计和实现⼀个事件处理的业务组件编排,需要解决如下问题:定义⼀个事件处理流程的基本概念集:事件数据(EventData)、基于事件数据的事件处理上下⽂语境( FlowContext) 及构建者(FlowContextBuilder)、事件处理流程定义(EventFlow)、事件处理组件声明和定义( ComponentProperties 和 FlowComponent);定义事件处理流程的基本模板(或者可以⾃定义);定义具体的业务事件处理的流程所需要的组件,并能根据指定业务类型来选择合适的流程;定义具体的业务组件,并能根据组件的功能和类型来选择合适的组件来执⾏。
整体框图如下:本⽂源代码在下的 cc.lovesq.flows 包下。
基本概念事件数据 IEventData表⽰任何事件数据;不同的事件处理可以定义不同的具体类 EventData。
public interface EventData {/*** 获取事件数据*/String getData();/*** 获取事件类型*/String getType();}事件处理语境 FlowContext 和 FlowContextBuilder基于 EventData 构建,⽤于处理事件过程中的上下⽂语境。
J a v a S w i n g中处理各组件事件的一般步骤集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN]Java Swing中处理各组件事件的一般步骤是:1.新建一个组件(如JButton)。
2.将该组件添加到相应的面板(如JPanel)。
3.注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。
4.定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
以上步骤我们可以用多种方法实现。
但人们通常用二种方法。
第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件;第二种方法是使用多个内部类来响应不同组件产生的各种事件,其具体实现又分两种方式,一种是匿名内部类,一种是一般内部类。
为了说明如何使用上述三种方法实现事件的处理方法,我们建立一个简单的应用程序。
该程序界面有两个按钮,当用户点击相应的按钮,就会弹出一个对话框显示相应的内容。
通过这个简单程序,你可以实现自己更多、更复杂的用户界面程序。
首先,我们利用单个监听器来实现该程序。
我们定义一个名为Simple1的类来包括所有代码。
所有的用户行为(如点击按钮)由一个监听器SimpleListenner中的actionPerformed方法来处理。
以下是代码:import .*;import .*;public class Simple1{private static JFrame frame;dd(myPanel);();(true);}}让我们来看看以上代码是如何工作的。
在main方法中,我们定义了一个JFrame,然后将面板Jpanel添加到窗体中,该面板包括两个按钮。
相应的变量Frame,button1,button2定义在程序的开头部分。
在程序入口main方法中,首先新建Simple1组件,通过构造器建立用户GUI,定义一个面板Jpanle,,增加两个按钮,然后利用将两个按钮加入到一个活动监听器SimpleLister中,最后,两个按钮添加到面板。
事件驱动程序设计图形用户界面是静态的,它应该能够响应用户的操作。
比如,当用户在GUI上输入一个字符或点击鼠标,都会发生事件,程序根据事件类型作出反应就是事件处理。
1.1 事件处理模型与事件类在Java 1.1版之前事件处理采用事件传递模型,这种方法有一定的缺点,因此从Java 1.1版开始,Java的事件处理采用了新的事件处理模型,我们称为事件代理模型(event delegation model)。
尽管在Java 2中仍然支持两种模型,但推荐使用新的事件模型。
所谓事件代理模型就是将事件的处理从事件源对象代理给一个或多个称为事件监听器(listener)的对象,事件由事件监听器处理。
事件代理模型把事件的处理委托给外部实体进行处理,实现了事件源和监听器分离的机制。
事件代理模型涉及到三种对象:事件源、事件和事件监听器。
①事件源(event source):产生事件的对象,一般来说可以是组件,如按钮、对话框等。
当这些对象的状态改变时,就会产生事件。
事件源可以是可视化组件,也可以是计时器等不可视的对象。
②事件(event):描述事件源状态改变的对象。
如按钮被点击,就会产生ActionEvent 动作事件。
③事件监听器(listener):接收事件并对其进行处理的对象。
事件监听器对象必须是实现了相应接口的类的对象。
Java的事件处理模型如图1所示。
首先在事件源上注册事件监听器,当用户行为触发一个事件时,运行时系统寻找事件监听器对象来处理事件。
图 1 Swing事件处理模型为了实现事件处理,Java定义了大量的事件类,这些类封装了事件对象。
Swing组件可产生多种事件,如点击按钮、选择菜单项会产生动作事件(ActionEvent),关闭窗口会产生窗口事件(WindowEvent)等。
所有事件类的根类是java.util.EventObject类,该类的定义为:package java.util;public class EventObject implements java.io.Serializable {protected transient Object source;public EventObject(Object source) {if (source == null)throw new IllegalArgumentException("null source");this.source = source;}public Object getSource() {return source;}294public String toString() {return getClass().getName() + "[source=" + source + "]";}}其中,getSource()方法是最重要的方法,它返回触发事件的事件源对象,注意它的返回类型是Object。
qtvtkwidget组件事件函数-回复QtVTKWidget是一个在Qt中使用VTK(Visualization Toolkit)库的QWidget子类组件。
它提供了一个简单易用的接口,使开发人员可以在Qt应用程序中集成和显示VTK渲染窗口。
在本文中,我们将探讨QtVTKWidget组件的事件函数,包括其定义和使用以及如何处理各种事件。
第一步:了解QtVTKWidget组件在开始讨论事件函数之前,我们需要了解QtVTKWidget组件的基本概念和功能。
QtVTKWidget继承自QWidget类,它是Qt应用程序的基本用户界面构件。
它提供了一个用于显示VTK 3D场景的窗口,其中可以进行交互和渲染。
QtVTKWidget组件可以在Qt Designer中可视化布局,还可以在代码中动态创建和设置属性。
通过QtVTKWidget,我们可以方便地将VTK渲染窗口集成到Qt应用程序的用户界面中。
第二步:理解事件函数在Qt中,事件函数是用于处理用户输入和应用程序响应的函数。
每个QtVTKWidget对象都可以接收和处理各种事件。
事件可以是键盘事件、鼠标事件、滚动事件、焦点事件等等。
每个事件都有一个对应的事件函数,用于处理特定类型的事件。
事件函数具有特定的签名,它们接收一个QEvent对象作为参数,并返回一个布尔值,表示该事件是否已经被处理。
第三步:事件函数示例现在让我们看一下如何定义和使用QtVTKWidget的事件函数。
以下是一个示例:cppclass CustomVTKWidget : public QtVTKWidget{public:CustomVTKWidget(QWidget *parent = nullptr);protected:void keyPressEvent(QKeyEvent *event);void mousePressEvent(QMouseEvent *event);};CustomVTKWidget::CustomVTKWidget(QWidget *parent) : QtVTKWidget(parent){构造函数中的初始化代码}void CustomVTKWidget::keyPressEvent(QKeyEvent *event){处理键盘按下事件if (event->key() == Qt::Key_Escape){如果按下了Esc键,执行特定操作close(); 关闭窗口}}void CustomVTKWidget::mousePressEvent(QMouseEvent *event) {处理鼠标按下事件if (event->button() == Qt::LeftButton){如果按下了鼠标左键,执行特定操作qDebug() << "左键按下";}}在这个示例中,我们定义了一个名为CustomVTKWidget的自定义QtVTKWidget子类。
组件及事件处理Java SwingJava Swing是Java的⼀个强⼤分⽀,为桌⾯程序设计提供了⾮常强⼤的⽀持。
通过⽤户图形界⾯GUI,⽤户和图形之间可以⽅便地进⾏交互。
java.awt包,提供了许多⽤来设计GUI的组件类。
早期主要使⽤java.awt类,javax.swing诞⽣后,该包提供了功能更为强⼤的类⽤于GUI设计。
javax. swing包中JComponent类是java. awt包中Container类的⼀个直接⼦类、是Component类的⼀⼀个间接⼦类。
窗JFrame⼀个基于GUI的应⽤程序应当提供⼀个能和操作系统直接交互的容器,该容器可以被直接显⽰、绘制在操作系统控制的平台上,例如显⽰器上,这样的容器被称作GUI设计中的底层容器。
Java提供的JFrame类的实例就是⼀个底层容器。
其他组件必须被添加到底层容器中,以便借助这个底层容器和操作系统进⾏信息交互。
JFrame是container类的间接⼦类。
⽅法作⽤setVisible(布尔值)设置窗⼝否可见(默认不可见)dispose()撤销当前窗⼝,并释放资源setDefaultCloseOperation(int operation)设置点击关闭图标后的处理⽅式operation取值取值含义DO_ NOTHING ON_ CLOSE什么也不做HIDE_ ON_ CLOSE隐藏当前窗⼝DISPOSE_ ON_ CLOSE隐藏当前窗⼝,并释放窗体占有的其他资源EXIT_ ON_ CLOSE结束窗⼝所在的应⽤程序JFrame windows = new JFrame("⼀个窗⼝"); //创建⼀个窗⼝,标题为“⼀个窗⼝”windows.setBounds(x,y,width,height); //指定组件位置及⼤⼩windows.setVisible(true); //使窗⼝可见windows.setDefaultCloseOperation(JFrame.EXIT_ ON_ CLOSE);//设置点击关闭图标后的处理⽅式处理事件1.事件源能够产⽣事件的对象都可以成为事件源,事件源必须是⼀个对象,⽽且这个对象必须是Java认为能够发⽣事件的对象。