Swing框架之Component

 

Swing框架之Component

         昨天晚上写完Swing的模型和渲染器之后,觉得对Swing的体系结构还是没有说清楚。Swing的基础体系结构中的四大基本对象Component、 Model、UI Delegate以及Renderer都值得详细解释。Swing的树状组件结构(虽然这是用户界面工具通有的特征)也值得详细解释,因为这是完成某些复 杂Swing组件,尤其像JTable、JTree、JList和JComboBox这种复杂组件中编辑功能得关键。此外,Swing / AWT的事件模型如Event Dispatching和Propagation和事件处理线程模型也需要详细解释,理解这部份是编写高效率Swing界面的关键。

         今天从Swing的四大基本对象Component说起。

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

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

         Component代表Swing对应用程序提供了如下几类编程接口:

  1. 用户界面的组件树的创建和修改的方法。这包括组件的添加和删除等操作。
  2. 组件属性访问的方法,比如组件位置、组件前后背景色、组件字体等等。
  3. 组件状态及生命周期的管理的方法,比如隐藏和显示、创建和销毁等等。
  4. 组件位置、大小的管理,包括通过布局管理器的方法。
  5. 组件事件处理接口的管理,包括添加、删除等操作。

         从开发者的角度来看,Component是组件树上的节点、是控制外观和行为的入口、是组件事件的发源地。从Swing组件实现者的角度来看, Component是协调Model和UI Delegate的操作的地方,是低层次事件处理的地方,是高层事件发生的地方,是同父组件和子组件交互的地方。掌握的这些角度,Swing程序员完全可 以实现自己的自定义简单组件,当然如需要实现类似于JTable和JTree等复杂的矢量组件,还需要进一步了解Swing的Model和UI Delegate以及Renderer模型。

         对于复合型(Composite)组件很简单,这儿要讲述的是如何实现自定义的组件,比如表盘,比如温度计这些没有标准组件可以使用的组件,那么如何自己实现这种自定义组件呢?

         不考虑Model分隔和UI Delegate皮肤分离问题,能够简化自定义Component的模型。总的来说自定义组件需要完成两样基本任务:第一侦听并处理低层事件,根据具体情 况改变组件状态,如需要还要发出高级事件;第二,根据当前组件的状态画出当前组件的外观。

         侦听底层的事件是指侦听类似于mouse、keyboard、focus等事件,然后处理此事件,如果发现此事件带有特定语义,表达某种组件行为,则改变 当前的组件状态以记录,并触发某种事件通知应用程序进行处理。举例说明,想象你准备实现一个简单的按钮,你可以通过继承JComponent来完成。你可 以在按钮初始化时,注册此按钮的鼠标事件侦听器,以侦听发生自己组件上的鼠标事件。当按钮捕获到鼠标按下时,检查鼠标按下的点是否在按钮有效区域内。如果 是,则认为当前是一个按钮按下动作,那么改变按钮的状态为按下去,调用repaint方法通知按钮重画成按下去的状态,然后发出 ActionPerformed的事件,通知注册在此按钮上的应用程序的ActionListener处理这个动作。下面是一个简单示意代码:

public class MyButton extends Jcomponent implements MouseListener{
    private String text;
    private boolean pressed=false;
    private ArrayList<ActionListener> listeners=new ArrayList<ActionListener>();
    public MyButton(){
        addMouseListener(this);//将自己注册为自己的鼠标事件侦听器,监听鼠标事件
    }
    ....
   public void mousePressed(MouseEvent evt){
        Point p=evt.getPoint();
        if(getBounds().contains(p)){//判断鼠标落点是否在有效区域内。
            pressed=true; //鼠标点击的含义是按钮被按下!改表按钮状态。
            repaint();    //通知按钮重画,由原来的抬起状态改变成按下状态。
            fireActionPerformed(new ActionEvent(this)); //这是一个按钮动作事件,触发它。
        }
   }
   public void addActionListener(ActionListener listener){
        listeners.add(listener);
   }
   public void removeActionListener(ActionListener listener){
        listeners.remove(listener);
   }
   protected fireActionPerformed(ActionEvent evt){
        for(ActionListener listener:listeners){
            listener.actionPerformed(evt);
        }
   }
   ...
   //这儿你要覆盖paint方法,实现按钮状态的重画
   public void paint(Graphics g){
       if(pressed){
         //画出按下的样子
       }else{
         //画出抬起的样子
       }
   }
}

         上面要注意的是你要自己管理自定义组件的事件监听器,包括addListener和removeListener方法,以及如何触发。这个过程很简单,基本上就是上面的模板来实现添加删除和触发。

         除了要负责事件的处理和新事件的触发,自定义组件第二个要完成的任务就是要根据组件当前的状态改变重画组件的外观。重画组件的外观只需要覆盖public void paint(Graphics g)方法即可以,在这个方法里,你只需要根据当前的组件状态分别画出当前的组件即可。

         当然除了上面两个基本准则外,不要忘了添加访问你的组件属性的方法,比如,如果上面的按钮是个二元按钮(相当于 JCheckbox/JToggleButton的那种按钮),你可能需要提供isPressed或者setPressed来获取和设置当前按钮的状态。 注意,在设置状态按钮变化的访问方法中,比如setPressed,你需要使用repaint方法通知按钮重新渲染(复杂的实现可能包括触发 propertyChange事件,这儿从简):

public void setPressed(boolean p){
    pressed=p;
    repaint();
}

         到此为止,你已经能根据上面的两条准则简单的实现你想要的组件了。但是你发现没有,你的按钮状态和外观行为都被堆到了Component (MyButton)中实现了,而且,对于各个平台都是一个样子,不能换皮肤。这对于比较简单、不想要皮肤的组件,可能没有什么,但是对于复杂的组件,比 如JTable或者甚至Excel类似的电子表格的那种组件,你把数据(组件状态)和外观堆在这儿实现就严重违反了MVC原则。

         如何简化这种组件的实现呢?使你实现的此种组件容易维护、扩展以及重用,皮肤容易换呢?这就需要Swing结构中的另外三个元素:Model、UI Delegate和Renderer,后面的几个文章将讲述Model、UI Delegate和Renderer帮你逐步实现一个复杂、灵活、可扩展、高效的矢量组件。

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

         今天这样讲,不知道讲明白没有。当初刚开始学习Swing的时候,还不了解Swing的这种MVC结构,因此当时自己做的自定义组件都是这样写的,没有单 独的Model和可以定制的UI Delegate,更不用说Renderer了。但是我觉得自己的这个学习过程,恰恰是人们学习Swing的最佳途径,先简化模型,然后逐步扩展,直到了 解Swing模型的全部图像

Swing GUI开发框架深入剖析 本文还有配套的精品资源,点击获取 简介:Swing作为Java中构建GUI的强大工具包,提供了丰富组件和布局管理器,使得开发者能够创建出跨平台兼容的界面。本框架深入讨论了如何利用Swing的可定制性进行功能扩展和自定义,包括封装组件、统一事件处理、布局管理、国际化支持、可扩展性、主题与外观定制、数据绑定、错误处理、工具栏和菜单系统以及对话框和通知机制。通过这些关键点,开发者... 阅读详情

相关推荐

从Protocol到硬件控制:揭秘高通UEFI中ABL与XBL的协作机制

本文深入解析了高通UEFI架构中ABL与XBL的协作机制,重点探讨了Protocol通信在硬件控制中的关键作用。通过对比传统GPIO控制方式,揭示了Protocol架构在安全性、可维护性和灵活性方面的优势,并提供了关机充电场景的实战案例分析及调试技巧。

weixin_29185199的博客 430

Swing如何使用?几个操作示例教会你!

Swing 是 Java 中的一个 GUI 工具包,它是由 Oracle 公司提供的一套基于 Java 的用户界面组件。Swing 使得开发人员可以创建具有各种各样特殊效果和个性化的图形化用户界面(GUI),从而增强了应用程序的用户体验。 Swing 的使用非常广泛,它可以与 JavaFX 和 AWT 等 GUI 工具包配合使用,也可以用于开发 Java SE 和 Java EE 应用程序,使得 Java 开发人员可以轻松地创建跨平台的 GUI 应用程序,这是 Java 应用程序中一个不可或缺的组成部分。

解决bug的路上 2491

3D Slicer中Auto3DSeg和TotalSegmentator等自动分割插件总是安装失败,怎么办?教你两招

TotalSegmentator, MONAI auto3Dseg,这些工具因分割器官多,准确性高,备受关注。同时,这些自动分割工具被集成在了3D slicer平台,非常方便临床医生做手术规划。详细了解这些工具看之前的教程👇-------- 简单概述 --------其中,MONAIAuto3DSeg扩展附带数十种针对特定临床用例的预训练分割模型,这些模型旨在快速运行,几分钟内即可在任何普通计算机上运行,无需 GPU,甚至在笔记本电脑上。

zzjlhlcd的博客 1698

自己封装的swing框架,能够快速写出一个页面(带Tab、菜单)

效果图: 现在写页面的方式有很多,Java也可以写页面,只不过太过繁琐了。鄙人不才,对swing进行简单的封装后,自我感觉顺手了许多(当然可能还有改进空间) StartFrame 启动程序 MainFrame 主要窗体 TabPanel tab面板 SwingBuilder 构建器,用来构建菜单以及tab页面结合 Theme 主题接口,用来适应不同分辨率屏幕的样式 BasePanel 基础面板,用来构建panel 传统写法: 我的写法: 上述效果图完整的页面: 三、页面步骤(

编程技术分享,Java后端、Vue前端 2455

STM32平台下FreeModbus TCP协议栈集成指南

深入讲解在STM32平台如何移植和配置freemodbus协议栈,实现TCP通信功能。结合嵌入式开发细节,帮助开发者快速掌握freemodbus的应用与调试技巧。

weixin_36001279的博客 1143

增量式PID的P和I怎么理解(一)

增量式PID的P、I理解之推翻片 据我所知的资料里关于PID三个参数的理解是这样的:(我这里只说P和I,先不说D) P的作用:比例P可以加快系统调节速度,P过小调节时间变长,响应性不够,P越大响应性越高超调也越严重,过大的P会使系统振荡。 I的作用:消除静差,提高控制精度,I越大越滞后,过大会使系统振荡。 ...

fangchenglia的博客 1万+

Java中的Swing是什么?

Swing提供了一组丰富的GUI组件,如按钮、文本框、复选框、列表框等,以及容器组件,如面板和框架,用于构建交互式应用程序的用户界面。这使得Swing应用程序可以在不同平台上保持一致的外观,并且可以自定义和定制组件的外观。此外,Swing还支持国际化和多语言支持,使得开发人员可以轻松地创建支持不同语言和地区的应用程序。总的来说,Swing提供了一个强大的工具集,使得开发人员可以方便地创建各种各样的GUI应用程序,无论是桌面应用程序、工具、编辑器还是游戏等。它已经成为Java GUI开发的主流选择之一。

2301_78263023的博客 1113

手把手教你用Qwen-7B打造医疗大模型:从数据准备到RLHF全流程实战

本文是一篇基于Qwen-7B-Chat模型构建医疗领域大模型的实战全流程指南。文章详细拆解了从数据准备、环境搭建,到增量预训练、监督微调(SFT)以及偏好对齐(DPO)的核心技术步骤,并分享了部署与持续优化的实践经验。通过LoRA等高效微调技术,帮助开发者掌握将通用大模型改造为专业领域专家的完整方法论。

weixin_29191761的博客 129

Swing框架之Component:续文一

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

。。。。。。。 1555

西门子S7-200 SMART 实战解析:滑动平均值滤波算法在模拟量信号处理中的应用

本文详细解析了在西门子S7-200 SMART PLC中实现滑动平均值滤波算法的实战应用。通过处理模拟量信号如温度、压力等,该算法有效抑制信号干扰,提升系统稳定性。文章涵盖算法原理、程序框架、信号采集及调试优化,为工业自动化工程师提供实用指南。

gitlab7runner的博客 1152

<PLC><socket><汇川>汇川PLC使用socket与其他控制器(如上位机)通讯模板程序示例

以上介绍了汇川PLC通用socket通讯的示例,事实上,汇川的官方手册也有使用示例,可以直接仿照使用,也可以加以修改。

用沸腾的热血,支付我们的人生吧! 3248

Swing框架之Component:续文三

Swing框架之Component:续文三 Swing事件与事件处理器模型          Component在Swing模型中是事件触发源。前一篇文章在描述Swing的事件处理模型时就已经提到了这个事件处理过程。简单来说,Swing组 件在侦听到原生事件并处理后,往往产生新的逻辑事件。逻辑事件是某些组件所特有的、具有特定语义的事件,比如JButton按下时产生 ActionEvent...

topinking的专栏 202

地平线旭日X3 安装xfce桌面+VNC查看USB摄像头

VNC是Virtual Network Computing的缩写,它是一种使用RFB(Remote Frame Buffer)协议的用于控制远程电脑的图形桌面分享系统。xfce桌面相比于GNOME桌面更加轻量,占用的资源更少,在没有GPU的设备上也可以运行(旭日的Desktop版本从外观上好像就是xfce桌面,具体没有尝试)。可以使用专用的VNC客户端连接到开发板,例如vnc viewer。板子默认带有openssh-server,因此,WiFi热点连接成功后,就可以使用ssh登录开发板了。

bingdund的博客 509

Swing框架之Component:续文二

         Swing的事件处理过程为:事件调度线程(Event Dispatch Thread)从事件队列(EventQueue)中获取底层系统捕获的原生事件,如鼠标、键盘、焦点、PAINT事件等。接着调用该事件源组件的dispachEvent。该方法过滤出特殊事件后,调用processEvent进行处理。processEvent方法根据事件类型调用注册在这个组件上的相应事件处理器函数。事...

kingzhyh的博客 273

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Swing入门之简单文本编辑器

使用Java开发窗口应用程序有两种选择: 1.AWT: Abstract Window Toolkit 2.JFC: Java Foundation Classes / Swing本文主要介绍Swing设计基本要素: 容器,组件,版面管理员,事件与监听器等基本概念 要了解Swing必须了解Swing继承架构,Swing是基于AWT而创建,因此要了解Swing继承架构必须先了解AWT继承架构一

Dextrad_ihacker的博客 4834

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java Swing组件和容器

Java Swing组件和容器 (Java Swing Components and Containers) A component is an independent visual control and Java Swing Framework contains a large set of these components which provide rich functionaliti...

cunfen6312的博客 814

老版QQ原生表情gif动态

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

Swing 学习1

AWT和swing中框架和组件类的继承 Object Component Container JComponent Window JPanel Frame JFrame 转载于:https://www.cnblog...

weixin_34025151的博客 62

ModernDocking:为Java Swing应用带来现代的停靠功能

ModernDocking:为Java Swing应用带来现代的停靠功能 项目介绍 在现代软件开发中,用户界面(UI)的交互体验至关重要。ModernDocking 是一个简单且强大的框架,旨在为 Java Swing 应用程序添加先进的停靠功能。不同于市面上其他陈旧的、不再维护的 Java Swing 停靠框架,ModernDocking 提供了一个易于使用且高度可定制的解决方案,使得开发者能够...

gitblog_00150的博客 805

【Practical API Design学习笔记】避免使用深层次继承

Swing框架中的Frame类,间接继承了Compone...

weixin_34416649的博客 175

GUI(图形用户界面)

一般在写图形用户界面的时候用C++的比较多,用java中的GUI很少,java web在开发时图形显示直接以网页的形式展示,但是这一块我想了解一下GUI的基础,所以就看视频学习了一下,下面是我看视频学习的一些总结: java.awt和javax.swing awt(Abstract Window ToolKit)抽象窗口工具包,需要调用本地系统方法实现功能;javax.swing是基于AWT基础

清风栀恋的博客 454

java的GUI界面编程

.Java之GUI编程 1.AWT (1).AWT(Abstract window Toolkit【抽象窗口开发包】它可以在各个系统下运行,他是跨平台操作的,开发出来的窗口程序在各个系统下表现都是一样的,但是没有体现出完全的跨平台,有可能在两个系统中比较,会发现两者之间的大小有区别)包括了很多类和接口,用于java  Application的GUI(Graphics User Interfac

linhao 2526

Swing框架学习

Swing是JFC的一部分 Swing提供窗口,按钮,表格等一系列控件; Swing是纯JAVA写的。 例如:JButton,JCheckBox,JScrollbar等都是JComponent的子类; 可以理解为JComponent是控件的超类; 上代码初学,可能还有理解不到位的地方: import java.awt.*; import java.awt.event.*; import...

大风起兮云飞扬 474
上一篇: Swing模型与渲染器
下一篇: Swing框架之Component:续文二
topinking
博客等级 码龄20年 15粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值