使用Java Swing组件进行事件处理方法的分析与比较
- 格式:doc
- 大小:31.50 KB
- 文档页数:7
本文通过对 Eclipse 的 SWT 和 Java Swing、Abstract Windows Toolkit (AWT)GUI 工具包进行比较,可以帮助新应用程序的开发人员从中选择适当的工具。
首先我们要弄清一个问题:为什么会有多个Java™ GUI 工具包呢?最好的答案是,一个工具包并不能满足所有的要求,最近也不会开发一个可以满足所有要求的 GUI 工具包。
每个工具包都有各自的优缺点,这样就可以根据自己的需求和目标用户来选择适当的工具包。
下面就让我们来学习有关这些工具包的知识。
AWT 概述Abstract Windows Toolkit(AWT)是最原始的 Java GUI 工具包。
AWT 的主要优点是,它在 Java 技术的每个版本上都成为了一种标准配置,包括早期的 Web 浏览器中的 Java 实现;另外它也非常稳定。
这意味着我们不需要单独安装这个工具包,在任何一个 Java 运行环境中都可以使用它,这一点正是我们所希望的特性。
AWT 是一个非常简单的具有有限 GUI 组件、布局管理器和事件的工具包。
这是因为 Sun 公司决定为 AWT 使用一种最小公分母(LCD)的方法。
因此它只会使用为所有 Java 主机环境定义的 GUI 组件。
最终的结果非常不幸,有些经常使用的组件,例如表、树、进度条等,都不支持。
对于需要更多组件类型的应用程序来说,我们需要从头开始创建这些组件。
这是一个很大的负担。
通常对于 AWT 来说(也适用于 Swing 和 SWT),每个事件类型都有一个相关的 XxxListener 接口(XxxAdapter 的实现可能为空),其中 Xxx 是去掉Event 后缀的事件名(例如,KeyEvent 事件的接口是 KeyListener),用来把事件传递给处理程序。
应用程序会为自己感兴趣处理的事件的事件源(GUI 组件或部件)进行注册。
有时监听接口要处理多个事件。
AWT 的一个很好的特性是它通常可以对 GUI 组件自动进行销毁。
AWT-SWT-Swing大比较之一:模型设计与实现总的来说Swing/AWT和SWT在事件处理机制上是类似的,窗口组件的树状结构也是类似的。
图形用户界面系统在事件处理设计上有两大类,一类是单线程模型,一类是多线程模型。
在事件处理机制上,三者都是遵循单线程规则。
单线程模型对于事件处理不保证线程安全性(Thread Safety),所有的事件处理都在Event Dispatch Thread(EDT)上进行,此一类事件模型通常叫做单线程模型。
这种模型规定所有对组件的访问操作必须在EDT上完成。
为什么对于组件的访问需要在EDT上完成?这主要是为了保证对于组件状态的改变是同步的,保证了界面组件的可确定性。
这中模型是大部分图形用户界面工具采用的模型,包括Swing/AWT、SWT、GTK、WinForm等等。
这种模型的好处是,结构设计和代码实现都比较简单,避免了为了实现线程同步的复杂处理。
但是也带来了一些问题,最常见的问题是,程序员容易将长时间复杂任务的处理放在事件处理函数完成,造成EDT线程被阻塞,给用户造成界面失去响应的错觉。
其实人们对于Swing速度慢和反映迟钝的感觉大部分来源于此,简单的说,是程序员的问题,而不是Swing自身的问题,是因为程序员没有理解这种事件处理机制造成的。
其实在SWT、GTK、WinForm等任何以这种事件模型为基础的工具都会出现。
重现的方法就是你简单的将长时间处理的任务放在事件处理函数中,你的用户界面就会失去响应。
如何解决这种问题?通用的办法就是采用异步线程处理长时间任务。
但是还要记住的是,在这种任务中对于界面的更新要采用SwingUtilities.invokeLater或者在SWT采用Synchroniz e方法,将访问操作放到EDT上进行。
关于如何写一个有效处理长时间任务的Swing程序,将会在其他文章中描述。
多线程模型中,所有的事件处理都是在异步线程中进行,界面组件同步访问的操作需要程序员来保证。
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中,最后,两个按钮添加到面板。
Java桌面应用开发指南:JavaFX和Swing比较与选择引言:随着互联网的发展,Web应用和移动应用的兴起,桌面应用似乎逐渐被边缘化了。
然而,在某些场景下,仍然有许多需求需要桌面应用来完成。
Java作为一种强大而灵活的编程语言,提供了多种选择来开发桌面应用,其中JavaFX和Swing是两个备受关注的框架。
本文将对JavaFX和Swing进行比较,并为开发者提供选择的指南。
一、JavaFX简介:JavaFX是一个用于构建富客户端应用程序的框架,它提供了丰富的图形和多媒体功能,以及现代化的用户界面控件。
JavaFX是Java平台的一部分,从Java 8开始成为Java标准库的一部分。
它使用Java语言和FXML(一种基于XML的用户界面描述语言)来创建应用程序。
二、Swing简介:Swing是Java平台上的一个GUI工具包,它提供了一组丰富的用户界面组件,可以用来构建跨平台的桌面应用。
Swing是Java SE的一部分,从JDK 1.2版本开始引入。
它使用Java语言来创建应用程序,可以通过布局管理器来管理组件的位置和大小。
三、比较与选择:1. 用户界面设计:JavaFX提供了现代化的用户界面控件,如按钮、文本框、表格等,可以轻松地创建吸引人的用户界面。
它还支持CSS样式和皮肤,可以实现界面的定制化。
相比之下,Swing的用户界面控件相对简单,需要自己实现样式和皮肤。
2. 响应式编程:JavaFX采用了响应式编程的思想,使用属性绑定和事件驱动机制来实现界面组件之间的交互。
这种方式可以使代码更加简洁和可读。
而Swing则采用了传统的事件监听机制,需要手动编写监听器来处理用户操作。
3. 多媒体支持:JavaFX提供了内置的多媒体支持,可以播放音频和视频文件,以及处理图像和动画。
而Swing则需要借助第三方库来实现多媒体功能。
4. 跨平台性:JavaFX和Swing都具备跨平台的特性,可以在不同的操作系统上运行。
swing事件处理机制Swing事件处理机制Swing是Java中用于创建图形用户界面(GUI)的一套组件库。
在Swing中,事件处理机制起着至关重要的作用。
本文将介绍Swing 事件处理机制的基本原理和使用方法。
事件处理机制是指当用户与GUI界面交互时,系统会自动检测并处理用户触发的事件。
在Swing中,事件可以是鼠标点击、键盘输入、窗口关闭等用户行为。
事件处理机制的核心思想是“观察者模式”,即当事件发生时,会通知相应的事件监听器进行处理。
在Swing中,事件源(Event Source)是指能够触发事件的组件,如按钮、菜单等。
事件监听器(Event Listener)是实现了特定接口的类,用于监听特定类型的事件。
当事件源触发事件时,会调用相应的事件监听器的方法进行处理。
Swing事件处理机制的基本步骤如下:1. 创建事件源:首先需要创建一个能够触发事件的组件,如按钮。
2. 创建事件监听器:根据需要,创建一个事件监听器类并实现相应的接口,如ActionListener接口用于处理按钮点击事件。
3. 注册事件监听器:将事件监听器注册到事件源上,以便监听事件的发生。
4. 处理事件:当事件源触发事件时,系统会自动调用事件监听器的方法进行处理。
下面以一个简单的示例来说明Swing事件处理机制的使用方法。
假设我们需要创建一个界面,其中包含一个按钮,点击按钮后会弹出一个对话框显示一条消息。
我们需要创建一个JFrame对象作为界面的容器,并设置布局管理器和关闭操作。
然后,创建一个JButton对象作为按钮,并设置按钮的文本。
接下来,创建一个JOptionPane对象作为对话框,并设置对话框的消息。
然后,我们需要创建一个事件监听器类,实现ActionListener接口。
在事件监听器类中,需要实现actionPerformed方法,用于处理按钮点击事件。
在该方法中,我们调用JOptionPane的showMessageDialog方法,将对话框显示出来。
java swing实验心得Java Swing实验心得在进行Java Swing实验的过程中,我深刻地体会到了Swing作为Java 的图形用户界面(GUI)工具包的强大功能和灵活性。
通过实践,我进一步掌握了Swing的基本概念、常用组件以及事件处理机制,深化了对面向对象编程的理解,并且体验了开发GUI应用程序的乐趣和成就感。
首先,在实验中我对Swing的基本概念有了更加清晰的理解。
Swing是一个用于构建图形用户界面的工具包,它是AWT(Abstract Window Toolkit)的扩展,提供了更多的组件和更强大的功能。
与AWT相比,Swing 更加独立、轻量级,具有更好的跨平台性能。
通过实验,我明确了Swing 使用的基本原则和构造GUI应用程序的基本步骤。
其次,我熟悉了Swing的常用组件及其使用方法。
Swing提供了丰富的组件,如按钮、标签、文本框、列表框、下拉框等等,每个组件都有特定的功能和属性。
在实验中,我通过与不同组件的交互使用,了解了它们的基本用法和常见属性的设置。
例如,通过按钮的点击事件实现交互,通过文本框的输入事件获取用户输入,通过列表框的选中事件实现列表项的处理等等。
此外,我对Swing的布局管理有了更深入的了解。
Swing提供了多种布局管理器,如FlowLayout、BorderLayout、GridLayout、GridBagLayout 等,用于管理组件的布局和排列。
在实验中,我掌握了这些布局管理器的基本使用方法,并且体验到了不同布局管理器对于界面布局的灵活性和效果的不同。
另外,我了解了Swing的事件处理机制。
Swing采用事件驱动的方式,通过监听器(Listener)对用户操作进行响应。
在实验中,我学会了使用事件监听器接口和适配器来处理用户的交互操作。
例如,通过为按钮添加ActionListener监听器,实现按钮的点击事件处理;通过为文本框添加DocumentListener监听器,实现实时监测文本框内容的变化等。
Swing中的事件处理监听器:ActionListener方法:actionPerformed事件:ActionEvent● String getActionCommand()actioncommand是控件内部的一个字符串,用于标识控件的状态。
此函数可以取得控件的状态,从而决定到底该做什么。
● int getModifiers()取得“产生此事件时,用户同时按下的组合键”● long getWhen()取得“产生此事件时的时间戳”事件产生原因:点击按钮,在列表框中选择内容,在文本框中点回车,计时器到期监听器:AdjustmentListener方法:adjustmentValueChanged事件:AdjustmentEvent● Adjustable getAdjustable()adjustable是一个接口,各种滚动条都实现了这个接口。
● int getAdjustmentType()取得滚动类型,共有UNIT_INCREMENT,UNIT_DECREMENT,BLOCK_INCREMENT,BLOCK_DECREMENT,TRACK共5种类型● int getValue()取得滚动滑块的当前值事件产生原因:滚动条的滚动监听器:ItemListener方法:itemStateChanged事件:ItemEvent● Objedt getItem()取得被选中的元素。
注意,返回值是Object,还应该进行强制类型转换。
● ItemSelectable getItemSelectable()ItemSelectable是一个接口,代表那些包含了n个可供选择的子元素的对象。
此方法返回产生此事件的对象。
此方法的作用主要在于,如果一个列表框是允许多选的,那么上面的方法就不好用了,应该用此方法得到列表对象,再取得被选中的多个元素。
● int getStateChange()取得选择的状态,是SELECTED还是DESELECTED事件产生原因:各种按钮的点击,列表框的选择监听器:FocusListener方法:focusGained、focusLost事件:FocusEvent● Component getOppositeComponent()得到“参与焦点变换的”另一个对象。
使用Java Swing组件进行事件处理方法的分析与比较摘要:Swing组件是Java基本类库的一部分,是用于开发Java应用程序用户界面的开发工具包。
通过具体实例分析了多种使用Swing 组件进行事件处理的方法,并对这些方法进行了比较。
关键词:Java;Swing;监听;内部类;事件0引言Swing组件是Java语言中用来编写图形化界面的工具包,它使用灵活、功能强大,使得开发人员利用其提供的各种类与方法能够快速地创建出符合用户需求的各种美观、实用的图形界面。
Swing组件具有自动对各种用户的动作产生响应的功能,例如当某一用户点击button按钮或选择菜单栏时,该动作将会被监听处理。
在代码编写的过程中注册监听器是必须完成的工作,通过它对事件源进行监听,这样在程序中就可以十分方便地对用户行为进行响应处理。
1使用Swing组件进行事件处理过程使用Java Swing组件进行事件处理的过程分为如下几个步骤:首先,创建一个新的Swing组件(例如按钮或者菜单栏等);其次,将刚刚创建的组件添加到定义的面板中去;然后,通过注册监听器对事件源进行监听(例如对用户点击按钮或者点击鼠标的动作);最后,在程序中编写响应事件源产生事件的各种方法。
上述几个步骤的实现可以通过多种方法来完成。
第一种可使用的方法是通过注册单个监听器并使用多个if条件判断语句来决定响应的事件源;第二种方法使用Java语言中的匿名内部类来进行相关的事件处理过程;第三种方法是通过一般内部类来进行事件的响应。
第二种、第三种方法从本质上来说,都是在进行事件处理的过程中使用了多个Java的内部类,而不同之处在于具体实现有较大变化。
下面通过一个简单的Java 应用程序(创建两个按钮,当用户点击按钮后产生不同的显示结果)展示怎样通过以上3种方法来实现Swing组件的事件处理过程。
1.1单个监听器方式该方法使用单个监听器来进行实现。
具体完成该方法的过程为:建立一个名为Example的类,当用户点击button按钮后,监听器ExampleListenner会对该动作进行监听并交由actionPerformed()方法来进行相应的事件处理。
在该过程中,使用了一个动作监听器来对事件源进行监听,用多个if的条件语句来决定是哪个事件源。
Example类构造器的主要代码:①JPanel panel1 = new JPanel();②JButton button1 = new JButton("button1 ");③JButton button2 = new JButton("button2 ");④ExampleListener listener1 = new ExampleListener();⑤button1.addActionListener(listener1);⑥button2.addActionListener(listener1);⑦panel1.add(button1);⑧panel.add(button2);// 添加按钮到面板第①句新建了一个panel1的面板对象;第②、③句创建了两个按钮:button1和button2;第④句创建了一个监听器;第⑤、⑥句让button1和button2两个按钮共享第④句中新建的监听器;第⑦、⑧句将两个button添加到第①句中的panel1面板中。
内部监听类ExampleListener用来监听事件并响应,监听器中的actionPerformed(ActionEvent e)方法的主要代码为:①if (e.getSource()==button1)②String bName = e.getActionCommand();③if (bName.equals("button1 "))④JOptionPane.showMessageDialog(frame1,"用户点击了button1 ");⑤else if (bName.equals("button2 "))⑥JOptionPane.showMessageDialog(frame1,"用户点击了button2 ");⑦else⑧JOptionPane.showMessageDialog(frame1,"未知事件源" );第①、②句通过getSource方法来判断用户点击了哪个按钮并使用getActionCommand方法获得按钮名称;第③到第⑧句利用if语句来确定事件源的产生即哪个按钮被用户点击了,在相应控件中输出相关提示。
main方法中的主要代码:①Example ex = new Example();②JFrame frame1 = new JFrame("ex ");③frame1.addWindowListener(new WindowAdapter(){④public void windowClosing(WindowEvent e)⑤{System.exit(0);} });⑥frame1.getContentPane().add(panel1);⑦frame1.pack();⑧frame1.setVisible(true);第①、②句创建了一个JFrame的对象frame1;第③~⑤语句在frame1对象中加入窗口监听器用来处理关闭事件的方法;第⑥~⑧句将面板panel1添加到frame1中,panel1中包含两个button按钮。
当程序运行时,通过注册过的监听器对两个button按钮进行监听,当用户点击其中的一个按钮后(使用if语句进行判断),相应的提示信息将显示在面板上。
1.2匿名内部类方式使用简单的匿名内部类作为addActionListener的变量即可。
在这种方法中,使用匿名内部类对组件事件进行监听,这样就可以避免运用if语句来判断哪个按钮被点击即哪个事件源产生的事件。
在Example类中需要改变的主要代码如下:①button1.addActionListener(②new ActionListener()③{ public void actionPerformed(ActionEvent e){④JOptionPane.showMessageDialog(frame1,"用户点击了button1 ");} } );⑤panel1.add(button1);// 添加按钮到面板第①~④句对按钮button1添加了一个动作监听器,一旦button1被点击,窗体会显示“用户点击了button1”的提示信息;第⑤句将已被监听button1放置于面板中。
针对button2可以使用与button1相同的监听方式完成对点击button2的动作进行事件处理。
1.3一般内部类方式这种方法将所有关于事件处理的程序代码聚集起来,增加代码的可阅读性和可维护性,避免使用第二种方法带来的代码混乱的重大缺陷。
由于使用了一般内部类,使得定义的内部类可以被Swing组件多次使用。
一般内部类来进行事件处理的主要代码如下:①private class Handler1 implements ActionListener②{ public void actionPerformed(ActionEvent e){③JOptionPane.showMessageDialog(frame1,"用户点击了button1");} }第①~③句语句创建了一个名为Handler1的类,它执行了ActionListener的接口,一旦button1被点击就会产生相应的事件处理。
针对button2,同样创建一个类似的类,使其在被点击后在面板中能够显示提示信息。
类构造器中每个按钮都进行了注册监听,监听通过内部类的方式实现,代码如下:button1.addActionListener(new Handler1());该语句为button1按钮增加了一个动作监听,参数为上文中的Handler1内部类对象,这样一来button1就被监听,若其被点击,相应的后续事件将会得到处理。
同样对于button2按钮来说,采取相同的手段也就完成了对点击button2事件源的事件处理。
2三种事件处理方法比较上述3种方法都可以实现Swing组件的事件处理。
使用单个监听器的方法时需要if语句的协助来完成对组件事件的监听,即判断事件源的产生。
面对简单的程序或者组件事件较少的情况时,这种方式简单而实用,反之将带来很大的问题。
长而复杂的程序代码使得程序的可读性和可维护性变得十分糟糕,这是开发人员最不愿意看到的情况。
使用匿名内部类的方法由于其本身的局限性也存在一些缺陷,如:组件的定义、类的定义及相关的事件处理代码零乱,分布于程序的各个角落,难以统一进行管理;嵌套的程序代码在遇到复杂情况时将给开发人员造成极大麻烦,使他们无法快速和便捷地对程序进行修改与维护。
使用一般内部类的方法能够较好规避使用匿名内部类带来的代码无序和混乱的问题,开发人员能够高效地定位代码段落,非常方便地对相应的代码段进行浏览和修改,此外该方法的程序代码能够被Swing组件反复使用。
3结语文章分析了Java Swing组件进行事件处理的3种方式。
虽然3种方式都能够完成相应的事件处理过程,但是使用单个监听器和匿名内部类的实现这两种方式或多或少存在一定的缺陷,而第三种方式即使用一般内部类,从代码的编写、代码的阅读、代码的维护和程序的可扩展性来讲都是比较好的实现事件处理的一种方式。
参考文献:[1]赵景晖,迟勇.Java语言程序设计[M].大连:大连理工大学出版社,2009.[2]郭庚麒,周江.Java程序设计项目教程[M].北京:中国铁道出版社,2011.[3]耿详义,张跃平.Java 2使用教程[M].北京:清华大学出版社,2012.。