`

详解Swing组件相应外观

    博客分类:
  • java
阅读更多
Swing将每个组件的视图和控制封装到一个称为UI委托的对象中。

因此,Swing的体系结构被称为模型委托结构而不是模式-视图-控制器结构。理想情况下,模型和UI委托直接的通讯是间接的,允许多个模型与一个UI委托相连,反之亦然。

UI委托

每个UI委托源自一个名为ComponentUI的抽象类。ComponentUI的方法描述了一个UI委托和使用它的组件之间进行通讯的基本原理。

注意的是每个方法都将JComponent作为一个参数。ComponentUI有很多方法,这里只给出几个最重要的:
◆static ComponentUI createUI(JComponent c):该方法通常用来返回UI委托的一个共享实例,该UI委托通过定义ComponentUI子类本身而定义。这个共享实例用于相同类型的组件之间的共享(例如,所有使用金属外观的JButtons共享同样的静态UI委托实例,默认情况下,该委托实例在javax.swing.plaf.metal.MetalButtonUI中定义。
◆InstallUI(JComponent c):该方法在特定的组件上安装ComponentUI。通常会给组件和它的模型添加一个监听器,当状态发生改变时来通知UI委托进行视图的更新。
◆Update (Graphics g, JComponent c):如果组件是不透明的,那么应该描绘它的背景并调用paint(Graphics g,JComponent C)方法。
◆Paint (Graphics g, JComponent c):为了能够正确地描绘,该方法要从组件收集所有需要的信息以及可能的模型。

为了增强特定UI委托的使用,我们可以调用一个组件的setUI()方法,如下所示:


JComponent类中定义了用于分配UI委托的方法,因为方法声明中不包含特定组件代码。然而,对数据模型而言这是不可能的,因为不存在所有模型可以追溯到的基接口(例如,不存在像Swing模型中的ComponentUI此类的基类)。为此,分配模型的方法在JComponent的子类中定义。

使用PLAF

Swing包含几个UI委托集。每个集合中包含了用于大部分Swing组件的ComponentUI实现,且每个这样的集合称为一个PLAF实现。

javax.swing.plaf包有继承自ComponentUI的抽象类组成,javax.swing.plaf.basic包中的类扩展了这些抽象类用来实现基本的外观。UI委托集合是所有其它外观类用作构建自己的外观的基类。基本外观不能自己使用因为BasicLookAndFeel是一个抽象类。有三个继承自BasicLookAndFeel的可插拔式外观实现:
◆Windows: com.sun.java.swing.plaf.windows.WindowsLookAndFeel
◆CDEMotif: com.sun.java.swing.plaf.motif.MotifLookAndFeel
◆Metal (default): javax.swing.plaf.metal.MetalLookAndFeel

同时还有一个模仿苹果用户接口的MacLookAndFeel,但是没有包含在Java2中,必须单独下载。多路外观javax.swing.plaf.multi.MultiLookAndFeel扩展了javax.swing.plaf中的所有抽象类。它运行同时使用多种外观的组合,且有意但并不仅限于和访问外观一起使用。每个多路UI委托的任务是管理每个它们的子UI委托。

每个外观包中都包含了一个继承自抽象类javax.swing.LookAndFeel:BasicLookAndFeel, MetalLookAndFeel, WindowsLookAndFeel等的类。这是访问每个外观包的中心点。当改变当前外观时,你会用到它们。同时UIManager类(用于管理安装的外观)使用它们来访问当前外观UIDefaults表(其中包含了用于每个Swing组件相应外观的UI委托类名称)。

要想改变应用的当前外观,你只需要简单调用UIManager的setLookAndFeel()方法,并将要使用的外观全名传递给该方法即可。

创建一个PLAF

在创建一个PLAF之前,你必须在Java中创建外观的两种设计方法中做出决定。其中一种方法是通过扩展javax.swing.plaf包来创建外观,另一种方法是通过扩展已经存在的外观包,通常是javax.swing.plaf.basic来实现。

如果要创建一个用于PC的外观,我们不推荐使用扩展来自javax.swing.plaf包中的外观的方法。这是因为javax.swing.basic包中已经扩展了几乎整个的javax.swing.plaf包供我们使用。这样我们可以通过挑选外观需要的东西来进行定制而不需要扩展和实现任何东西。

javax.swing.plaf包的实现遵循的一个基本原则是使得定制一个外观尽可能的简单。这个原则是LookAndFeel类中组件,颜色和UI类的中心。

javax.swing.plaf.basic包以我们希望的方式描绘轻量级Swing组件。如果你是为一台设备而不是计算机屏幕创建一个外观,那么最好的方法是从零开始扩展javax.swing.plaf包。

Peter V.Mikhalenko是 Sun公司认证专业技术人员,现为Deutsche银行业务顾问。
分享到:
评论

相关推荐

    Java软件开发实战 Java基础与案例开发详解 14-5 可视化开发swing组件 共10页.pdf

    MyEclipse 7.5新增的可视化开发Swing组件功能,使得开发者可以通过直观的拖拽操作来创建和编辑Swing组件,极大地提高了开发效率。 ### 14.5.2 创建Swing组件的具体操作步骤 1. **创建Swing组件**: - 在项目名上...

    Java+Swing图形界面开发与案例详解实例代码

    Swing组件的布局管理器是构建GUI的重要工具。Java Swing提供了多种布局管理器,如FlowLayout、BorderLayout、GridLayout、 MigLayout等,它们负责控制组件在容器内的排列方式。开发者可以根据需求选择合适的布局管理...

    Java网路编程技术Java Swing组件代码

    ### Java网络编程与Swing组件应用详解 #### Java网络编程技术概述 Java网络编程是Java技术体系中的一个重要组成部分,它使开发人员能够构建基于网络的应用程序和服务。Java平台提供了丰富的API来支持网络通信,...

    Java Swing图形界面开发与案例详解

    10. 自定义组件:如何扩展Swing组件以实现个性化功能。 11. 图形绘制:使用Graphics2D进行高级图形绘制。 12. 多线程:在Swing中安全地使用多线程,避免阻塞UI。 13. 国际化:实现应用的多语言支持。 14. 状态栏和...

    Java Swing图形界面开发与案例详解及随书实例代码

    Swing提供了模型-视图-控制器(MVC)架构,这意味着组件的行为和外观是分离的。例如,JButton有一个ActionListener接口,你可以实现这个接口来处理按钮被点击的事件。同时,你可以通过设置按钮的文字、图标等属性来...

    《java+swing图形界面开发与案例详解》源代码

    Swing还支持丰富的UI定制,包括自定义外观(LookAndFeel)和组件图标。通过更换LookAndFeel,开发者可以轻松改变整个应用的视觉风格,从系统默认到金属风格,再到Nimbus等。此外,还可以自定义组件的渲染器和编辑器...

    JavaSwing图形界面开发与案例详解和实例代码

    3. **模型-视图-控制器**(MVC):Swing组件遵循MVC设计模式,将数据(模型)、显示(视图)和用户交互(控制器)分离,提高了代码的可维护性和可扩展性。例如,JTable组件就包含了TableModel、TableColumnModel和...

    Java_swing详解

    1. JComponent:所有Swing组件的基础类,它扩展了AWT的Component类,增加了事件处理和定制外观的能力。 2. JFrame:用于创建顶级窗口,是大部分Swing应用的起点。你可以在这个框架内添加其他组件来构建用户界面。 3....

    Java.Swing图形界面开发与案例详解.王鹏等——第8章

    一、Swing组件 Swing提供了一系列预定义的组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)、面板(JPanel)、滚动窗格(JScrollPane)、列表(JList)、表格(JTable)、树(JTree)等。这些组件...

    Java.Swing图形界面开发与案例详解.王鹏等——第7章

    本章"Java.Swing图形界面开发与案例详解"深入探讨了Swing组件的使用和实践,旨在帮助学习者掌握如何在Java环境中创建美观且功能丰富的用户界面。 Swing提供了丰富的组件集合,包括按钮(JButton)、文本框...

    swing组件JComboBox

    ### Swing组件JComboBox知识点详解 在Java Swing框架中,`JComboBox`是一个非常重要的组件,它主要用于实现下拉列表的功能,常被用作用户输入的一种形式。本文将围绕如何在Swing组件`JComboBox`中获取下拉列表中的...

    JavaSwing程序开发

    Swing组件被称为“轻量级”组件,这是因为它们不依赖于底层操作系统的窗口机制。相比之下,AWT组件是“重量级”的,因为它们直接依赖于本地系统提供的GUI组件。Swing的这一特性使得Java应用程序能够在不同的操作系统...

    SwingUI-JFC好书.pdf

    通过继承现有的Swing组件类或实现相应的接口,可以轻松实现自定义功能。 5. **国际化与本地化**:Swing支持国际化和本地化,使得开发的应用程序能够适应不同地区和语言的需求。开发者可以通过配置资源文件等方式来...

    《JavaSwing图形界面开发与案例详解》实例代码

    还有Swing的外观和感觉,即LookAndFeel,可以改变整个应用的视觉风格,使其适应不同操作系统或个人喜好。 文件列表中提到的实例代码可能包括了上述所有概念的示例,读者可以从中学习到如何创建窗口、添加组件、布局...

    swing-学生选课系统

    Swing组件是轻量级的,它们运行在Java虚拟机上,相比AWT组件更加灵活,可以实现更多的自定义功能。 二、Swing事件处理 在学生选课系统中,用户与界面的交互是通过事件驱动机制实现的。例如,当学生点击“选课”按钮...

    Swing框架定制Component

    Swing的核心类`JComponent`继承自`Component`,并且进一步继承自`Container`,这使得Swing组件既可以作为容器使用,也可以作为叶节点使用。Swing的设计模式允许开发者通过覆盖特定的方法来自定义组件的行为和外观。 ...

    SwingQQ详解(不才之作,敬请欣赏)

    这可能通过改变头像组件的外观或者使用动画效果来实现。Swing提供了`Timer`类来实现定时任务,例如每隔一段时间检查新消息并更新头像状态。 6. **联系人和群组管理**:SwingQQ允许用户添加、删除和修改联系人和群组...

    swing用户届面设计.pdf

    Swing的组件几乎都是轻量级组件,这意味着它们不依赖于特定的操作系统对等组件,而是完全由Java实现,这确保了Swing组件在不同平台上的表现一致性。 Swing的轻量级特性使得它能够在任何平台上呈现统一的外观和行为...

Global site tag (gtag.js) - Google Analytics