Swing框架之Component:续文三

Swing事件与事件处理器模型

         Component在Swing模型中是事件触发源。前一篇文章在描述Swing的事件处理模型时就已经提到了这个事件处理过程。简单来说,Swing组件在侦听到原生事件并处理后,往往产生新的逻辑事件。逻辑事件是某些组件所特有的、具有特定语义的事件,比如JButton按下时产生ActionEvent、JComboBox一项被选中时产生ItemEvent,等等。和原生事件不同,它们并不被派发到系统事件队列中,而是由组件直接触发。事件处理器作为组件的观察者添加到组件上并侦听触发的事件。假设事件名叫XXX,Swing中实现这个模式的一般模式是:

1.定义一个XXXEvent

public class XXXEvent extends Event{
    ...
    public void XXXEvent(Object src){
        super(src);
        ...
    }
   
...
}

2.定义一个事件处理器接口XXXListener,声明所有和该事件相关的处理方法:

public interface XXXListener extends EventListener{
    void action1(XXXEvent evt);
    void action2(XXXEvent evt);
    ...
}

3.在触发它的组件中定义一下方法:

public class MyComponent extends Jcomponent{
   
...
   
//存放事件处理器的队列
   
private ArrayList<XXXListener>xxxListeners=new ArrayList<XXXListener>();
       
//定义以下各种方法,访问符号用public,以方便添加删除处理器
       
public void addXXXListener(XXXListener listener){
           
xxxListeners.add(listener);
       
}
       
public void removeXXXListener(XXXListener listener){
           
xxxListeners.remove(listener);
       
}
       
//定义各种触发(fire)action1、action2...的方法,注意一般使用protected,以便继承和扩展
       
//每一个action都要定义一个相应触发(fire)的方法
       
protected void fireAction1(XXXEvent evt){
           
for(XXXListener listener:xxxListeners){
               
listener.action1(evt);
           
}
       
}
       
protected void fireAction2(XXXEvent evt){
           
for(XXXListener listener:xxxListeners){
               
listener.action2(evt);
       
}
   
}
   
...
   
//在某些地方,比如鼠标处理函数中触发相应的动作
   
void myMouseReleased(MouseEvent evt){
       
...
       
if(应该触发action1)
           
fireAction1(new XXXEvent(this));
       
...
       
if(应该触发action2)
           
fireAction2(new XXXEvent(this));
       
...
    
}
}

         XXXEvent、XXXListener、addXXXListener、removeXXXListener以及各种fireAction函数多是重复性代码,有些Java IDE如JBuilder中能够根据开发者的指定参数的自动生成这些代码。

         实际上这个观察者模式的编程范式可以推广到任何JavaBeans,不一定是可视化的Swing组件。以前曾经见过JBuilder做的一个所谓数据库操作的JavaBeans,它没有界面,但它和Swing组件完全一样添加删除处理器。它的功能是异步操作数据库,在数据操作完了之后触发注册在上面的事件处理器,该事件处理器就可以将查询结果展现在表格中,或者输出成报表等等。

         在这个模型中,JavaBeans本身既可以是事件源(被观察对象),也可以是事件处理器(观察者),JavaBeans也可以侦听自身的事件并且处理。比如前面文章所提的MyButton在处理鼠标事件时就是自己侦听自己发出的鼠标事件,自己既是事件源,又是事件处理器,形成自反系统。各种各样的JavaBeans通过这种机制联系成一张事件网,各种JavaBeans就是这个网上的节点,而它们之间的事件触发与事件处理关系就是这张网络上的线。当某个节点被外界或自身发出的事件所触发时,行成了事件的传播。这个过程很像网络上节点的振动引起周围周围节点振动的模型。下图示意了这种JavaBeans之间的事件网:

         例如new JscrollPane(new JtextArea())这个系统,它里面包括两个JScrollBar和一个JTextArea,当鼠标拖动事件触发JScrollBar时,JScrollBar处理了这个鼠标拖动事件,并发出滚动条拖动事件,这个事件传播给JTextArea,JTextArea处理这个拖动事件,相应的更新自己显示的内容,如果JTextArea之后又根据更新发出了一个新的事件,这个事件便会继续传播下去。

Swing布局管理器

         现在高级图形用户界面工具一般都包括布局管理器机制。什么叫做布局管理器?如果所有窗口的大小是不变的,那么我们在往窗口中添加组件时,只要将组件的拖放到固定位置、调整好尺寸就可以了,就像VB的界面工具一样。可大多数情况并非如此,用户经常需要调整窗口的大小,以便和其他程序协同工作。这种情况下,在传统界面工具中,比如VB,就需要显式的侦听窗口尺寸调整事件,根据当前窗口的大小重新计算并调整各个组件的大小和位置。AWT/SWT/Swing将这个过程自动化、模块化了,抽象出一个布局管理器来负责管理界面组件的布局。

         它们实现原理是相似的:容器类组件侦听初始化、invalide/validate以及容器尺寸调整等事件,一旦发生这些事件,容器类组件检查自己是否配置了布局管理器,如果没有,则不做任何事情;如果有,则将容器内组件的布局代理给布局管理器,让它来完成容器内组件的重新布局。

         容器管理器对象对实现两类接口:LayoutManager和LayoutManager2,LayoutManager2是LayoutManager的一个扩展,允许组件在添加时指定位置参数。它们的定义和含义如下:

public interface LayoutManager {
   
//添加组件comp,并和name关联起来,name可以作为位置等特殊含义参数来使用
   
void addLayoutComponent(String name, Component comp);
   
//删除组件comp
   
void removeLayoutComponent(Component comp);
   
//根据容器内的当前组件,计算容器parent的最优尺寸。
   
Dimension preferredLayoutSize(Container parent);
   
//根据容器内的当前组件,计算容器parent的最小尺寸。
   
Dimension minimumLayoutSize(Container parent);
   
//重新布局容器parent,这儿是主要布局逻辑所在。
   
void layoutContainer(Container parent);
}
public interface LayoutManager2 extends LayoutManager {
   
//添加组件comp,constraints用作指定如何以及位置的参数,这个函数主要是弥补LayoutManager版的addLayoutComponent表达能力欠缺而添加。
   
void addLayoutComponent(Component comp, Object constraints);
   
//根据容器内的当前组件,计算容器parent的最大尺寸。看来除了最优、最小,某些情况下还是需要知道最大。
   
public Dimension maximumLayoutSize(Container target);
   
//指定水平方向上组件之间的相对对齐方式,0表示和源组件对齐,1表示远离源组件。
   
public float getLayoutAlignmentX(Container target);
   
//指定垂直方向上组件之间的相对对齐方式,0表示和源组件对齐,1表示远离源组件。
   
public float getLayoutAlignmentY(Container target);
   
//invalidate这个布局管理器,有时布局管理器为了计算迅速,可能第一次计算之后就将一些数据给缓冲,但是后容器内的组件数目发生变化,这儿的缓冲值就需要调用这个方法通知更新
   
public void invalidateLayout(Container target);


}

         Swing在java.awt和javax.swing中都分别提供大量的布局管理器,这些布局管理器有简单的如FlowLayout,有复杂的如GridBadLayout。用户还可以自己定义自己的布局管理器,由于篇幅原因,这儿略去例子。

         Java 6中在布局管理中引入了BaseLine / Anchor的概念,能协助Java IDE的用户界面设计工具,方便用户来设计布局组件。NetBeans的Matisse组件首先引入了一个GroupLayout布局管理器,结合Matisse使用,提供了非常方便的布局管理和界面设计。GroupLayout和BaseLine/Anchor概念以及Matisse可以说是Java界面设计工具的一大进步,可以说足以成为Java桌面应用史上的一个里程碑。在这之前,缺乏有力的界面设计工具是Java在桌面应用失败的一个重要原因。虽然Anchor概念早就在Delphi界面设计工具出现过,但是这个工具的出现还是Java界面设计史上的一大事件。随着Java 6桌面应用支持的增强,以及NetBeans Matisse之类界面设计工具的出现,使得Java桌面应用时代已经到来。Seeing is believing,你不妨试一下就知道了。

=====================================

         本想再加一节讲述Swing双缓冲机制,但是想到双缓冲并不是Swing模型的核心概念,没有它并不影响理解Swing的总体模型,因此打算把它作为以后的一篇专门技术文章来写。

         这样Swing模型中的Component部分就算是描述完了,从明天开始,讲述Swing模型中的另外三个重要概念:Model、UI Delegate和Renderer。

swingComponent swing包下图形界面编程的使用方法,RadioButtonPanel,ToolbarPanel,CheckBoxPanel,PasswordPanel 立即下载

相关推荐

SwingComponent

SwingComponent

Swing框架之Component

Component在Swing的MVC模型中担任Controller的角色,同时它也是SwingAPI中代表具体组件的对象。Component在Swing中对外负责提供API接口,对内负责协调控制Model和UIDelegate(有时可能还包括Renderer)的操作,可以说是整个Swing结构的中心角色。为了方便你回忆Swing的MVC模型,将Swing模型示意图引了过来:

expleeve 3608

jenkins安装、打包、部署

一个可以让小白部署发布项目的软件;git 配置 一定要配置git的命令路径jenkins启动命令,一定要加这一段 -Dhudson.util.ProcessTree.disable=true一定要配置jenkins的节点,BUILD_ID和DONTKILLME 否则会导致打包后,会将运行的java程序进程也杀死创建任务SSH中执行服务器B的命令的时候,cd /opt;一定要cd 打开那个目录,否则文件无法传输过去。

学海无涯,我用JAVA 5217

Swing 组件概述 java

基本所有组件都遵循javabean规则,即get%与is%获得属性、set%设置属性。 1.      Component    组件 事件:ComponentEvent(移动、改变大小、隐藏、显示),FocusEvent(获取、失去焦点)            KeyEvent(释放、按下键),MouseEvent(按下、释放、点击、移入、移除、移动、拖动鼠标)  由于Component

yuge1hao的专栏 805

自抗扰控制(ADRC)原理与MATLAB实现详解

自抗扰控制(ADRC)是一种先进的鲁棒控制策略,其核心在于通过扩张状态观测器(ESO)实时估计并补偿系统总扰动。相比传统PID控制,ADRC不依赖精确数学模型,特别适合处理非线性、时变系统。从控制原理看,ADRC将系统内部动态和外部扰动统一建模,通过带宽参数化方法实现快速响应与强抗扰能力。在工程实践中,ADRC已成功应用于无人机飞控、伺服系统等场景,MATLAB仿真显示其上升时间可比PID提升46%,抗扰动恢复时间缩短60%。典型实现包含ESO设计、扰动补偿和PD控制三部分,参数整定遵循ω₀=3~5倍系统带

weixin_33585822的博客 95

告别以太网瓶颈:手把手教你为AI训练集群搭建InfiniBand网络(以NVIDIA DGX A100/H100为例)

本文详细指导如何为AI训练集群搭建InfiniBand网络,解决以太网瓶颈问题,特别针对NVIDIA DGX A100/H100系统。通过硬件选型、网络架构设计和性能调优,显著提升多机多卡训练效率,适用于大规模模型训练场景。

weixin_30336061的博客 310

javaGUI学习40:Swing-JComponent类

1、JComponent类概览 JComponent扩展java. awt.Container,而 java. awt . Container又扩展java.awt . Component,因此,所有的Swing组件都是AWT容器。Component 和Container类本身提供了大量的功能,因此,JComponent继承了大量的功能。 因为JComponent为几乎所有的Swing组件提供下层构件,因此,它是一个很大的类,包括100多个public方法。JComponent类为它的扩展提供了下面的功能:

八十岁老将的博客 1919

蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南

本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。

weixin_30786657的博客 322

Java GUI编程

GUI(Graphical User Interface)即图形用户界面,它能够使应用程序看上去更加友好。

qq_55674489的博客 4300

Anaconda安装及配置+pytorch深度学习环境(2024复旦计算机工作站0705)

Pytorch是torch的python版本,是由Facebook开源的神经网络框架,专门针对 GPU 加速的深度神经网络(DNN)编程。Torch 是一个经典的对多维矩阵数据进行操作的张量(tensor )库,在机器学习和其他数学密集型应用有广泛应用。与Tensorflow的静态计算图不同,Pytorch的计算图是动态的,可以根据计算需要实时改变计算图。但由于Torch语言采用 Lua,导致在国内一直很小众,并逐渐被支持 Python 的 Tensorflow 抢走用户。

ZhiYilang的博客 2348

解锁PyCharm+Deepseek:本地部署AI编程超能力

在本次探索中,我们成功地在 PyCharm 中实现了 DeepSeek 的本地化部署,这一过程虽然涉及多个步骤,但每一步都为我们开启 AI 编程大门奠定了基础。从安装最新版 PyCharm,确保我们拥有一个功能强大且兼容性良好的开发环境,到注册 DeepSeek 账号并获取 API Key,这是连接我们与强大 AI 能力的关键纽带。接着,在 PyCharm 中安装 Continue 插件并进行精细配置,让 DeepSeek 能够深度融入我们的编程流程。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 5548

Swing框架之Component:续文一

Swing框架之Component:续文一 (2007-01-09 21:30:56) 转载▼   分类: Swing          昨晚回去后还是觉得Component对象本身说的太简单,想来想去,觉得内容实在是太多,有必要补充两个续文说明Component的其它概念。今天介绍Swing组件paint方法的处理流程,这个流程能使我们理解许

。。。。。。。 1555

SIMULINK开发项目实例 1000 例专栏之第960例--基于电力系统稳定性的建模与仿真场景:-含分布式电源的配电网电压稳定性研究

间歇性与随机性:例如,太阳能依赖于日照强度,风能依赖于风速,这使得它们的输出功率具有不确定性。逆变器接口:大多数分布式电源通过逆变器接入电网,这对电网的动态响应特性产生了影响。位置分散:通常分布在用户侧或靠近负荷中心的位置。本文详细介绍了如何使用Simulink结合Simscape Electrical 构建一个用于研究含分布式电源配电网电压稳定性的模型,并提供了详细的仿真流程说明。

xiaoheshang_123的博客 153

Swing框架之Component:续文二

2008 - 05 - 06 Swing框架之Component:续文二          Swing的事件处理过程为:事件调度线程(Event Dispatch Thread)从事件队列(EventQueue)中获取底层系统捕获的原生事件,如鼠标、键盘、焦点、PAINT事件等。接着调用该事件源组件的 dispachEvent。该方法过滤出特殊事件后,调用processEvent进行处理...

topinking的专栏 157

IP-Guard分类管理详解

大家都知道在配置IPGUARD策略前需要做分类库进行设置和分类。 1、应用程序:可以分类,例如上班时间只能用OFFICE和WPS,记事本等办公软件,可以在分类里设置一个类 ;办公软件,在未分类里找到OFFICE,WPS等拖入心建的分类里就可以在配置策略里调用。 2、网站分类也不一样,可以按照自己方式自定义。也可以导入厂家已经收集到的网站分类。 3、邮箱分类:可以提前定义好一个或...

IP-Guard专栏 589

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java component类_Swing Component类

boolean action(Event evt, Object what) - Deprecated. As of JDK version 1.1, should register this component as ActionListener on the component which fires action events.void add(PopupMenu popup) - Adds...

weixin_42497762的博客 512

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java 画笔跟swing组件_浅谈JavaFX与Swing component的混用

最近需要用Java编写一个视频播放器,通过网上找教程,发现利用JavaFX程序库最合适。再初步学习了JavaFX的教程后,确实能够很快速的搭建一个功能完善的视频播放器。但是问题来了,JavaFX自带有一套完整的交互组件,例如FXTextField, FXLabel等,类似于Swing里的同名组件。然而JavaFX运行的时候同样有自己独立的Thread,这让将JavaFX整合到现有Swing组件中,...

weixin_39572794的博客 346

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Swing component使用方式

<br />在使用Swing中JFrame、JPanel及其他Composite组件时有两种方式。<br /> <br />1, 新建一个类并继承此类组件,然后在新的类中向其中添其他组件。<br />      例如 <br />      Class AKindJFrame extends JFrame {<br />             AKindJFrame(){<br />                 Container contents = getContentPane();<br /> 

Jinuxwu的专栏 1483

使用Swing组件2-JComponent

JComponent类 官方API:https://docs.oracle.com/javase/tutorial/uiswing/components/jcomponent.html#complookapi 除顶级容器外,名称以“J”开头的所有Swing组件都从 JComponent该类开始。例如JPanel,JScrollPane,JButton,和JTable所有的继承JComponen...

二木成林 2589

Swing JComponent类

+java.lang.Object   +java.awt.Component     +java.awt.Container       +javax.swing.JComponent API中文解释:   该类是除顶层容器外所有 Swing 组件的基类。要使用继承自 JComponent 的组件,必须将该组件置于一个根为顶层 Swing 容器的包含层次结构(contain

TuxedoLinux的博客 3563

java getcomponents_关于Java中的getComponent(),到底是什么意思呢?

importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassSwingWindowsextendsJFrame{JPopupMenuj=newJPopupMenu();publicSwingWindows(){this.setTitle("第一个swi...import javax.swing.*;import ja...

weixin_34475212的博客 1142

java getcomponents()_Java Swing - 如何创建getComponentAt()从JFrame获取Component

import java.awt.BorderLayout;import java.awt.Color;import java.awt.Component;import java.awt.Container;import java.awt.Point;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swi...

weixin_33050129的博客 664

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 333
上一篇: Swing框架之Component:续文二
下一篇: Swing框架之Model之一
kingzhyh
博客等级 码龄19年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值