`
mylxiaoyi
  • 浏览: 335260 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[翻译]核心Swing组件(一)

    博客分类:
  • Java
阅读更多

在第3章,我们简要介绍了JFC/Swing工程组件所用的Model-View-Controller(MVC)模式。在本章中,我们将会开始探讨如何使用许多可用组件中的关键部分。

所有的Swing组件都是以JComponent类为起点的。尽管Swing库的某些部分并不以JComponent类为根,但所有的组件在其继承的某些级别上共享JComponent类作为通用父类。JComponent类定义通用的行为与属性。在本章中,我们将会了解一些通用功能,例如组件绘制,自定义义,工具提示以及变化大小。

随着特定JComponent子孙类被关注 ,我们将会特别了解JLabel,JButton以及JPanel,三个更为广泛使用的Swing组件类。为了组件内显示图像,我们需要理解Icon接口,以及当使用预定义图像时的ImageIcon类与GrayFilter类的支持。另外,我们将会了解AbstractButton类,他是JButton类的父类。所有的AbstractButton的子类所共享的数据模型是ButtonModel接口;我们将会探讨这个接口及其特定实现,DefaultButtonModel。

4.1 JComponent类

JComponent类是所有的Swing组件继承的抽象基类。JComponent类有42个派生子类,每一个都继承了JComponent的功能。图4-1显示了继承层次结构。

尽管JComponent类是所有Swing组件的共同基类,但是Swing工程库中的许多类并不是由JComponent类派生类。这包括所有的高层窗口对象,例如JFrame,JApplet以及JInternalFrame;所有的MVC相关的类;事件处理相关的接口与类;等。所有这些类将会后面的章节中进行讨论。

尽管所有的Swing组件扩展JComponent,JComponent类扩展AWT的Container类,相应的,其扩展AWT的Component类。这就意味着许多的JComponent方面都是由AWT的Component与Container类所共享的。

4.1.1 组件分片

JComponent类定义了许多超出原始的AWT组件集合功能的AWT组件面。这包括自定义绘制行为以及自定义显示设置的不同方法,例如颜色,字体以及其他的客户端设置。

绘制JComponent对象

因为Swing的JComponent类是由Container类扩展而来的,因而会遵循基本的AWT绘制模型:所有的绘制都是通过paint()方法来完成的,而repaint()方法则用来触发更新。然而,许多任务的完成是不同的。JComponent类优化了绘制的许多方面从而改进性能与可扩展性。另外,RepaintManager类可以用来自定义绘制行为。

为了改进绘制性能与扩展性,JComponent将绘制操作分为三个任务。public void paint(Graphics g)方法被分为三个独立的protected方法调用。由调用的顺序,他们依次为paintComponent(g), paintBorder(g)以及paintChildren(g),通过原始的paint()调用传递Graphics参数。组件本身首先通过paintComponent(g)进行绘制。如果我们希望自定义Swing组件的绘制,我们可以重写paintComponent()方法而不是paint()方法。除非我们希望完全替换所有的绘制,我们需要首先调用super.paintComponent(),正如下面所示的,来获得默认的paintComponent()行为。

public class MyComponent extends JPanel {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// Customize after calling super.paintComponent(g)
}
...
}
 


paintBorder()与paintChildren()方法是不可重写的。paintBorder()方法绘制组件周围的边框,第7章会对其概念进行更为完全的描述。如果在Swing容器对象内存在组件,则paintChildren()方法会绘制这些组件。

为了优化绘制,JComponent类提供了三个额外的绘制属性:opaque, optimizedDrawingEnabled以及doubleBuffered。其作用如下:

  • Optacity:JComponent的opaque属性定义了一个组件是否透明。当透明时,JComponent容器必须在组件之后绘制背景。为了改进性能,我们可以保留JComponent的不透明物并使得JComponent绘制其背景,而不要依赖于容器来绘制被覆盖的背景。
  • Optimization:optimizedDrawingEanbled属性紧邻的子元素是否可以重叠。如果子元素不可以重叠,可以极大的减少重绘时间。在默认情况下,优化绘制对于绝大多数的Swing组件是允许的,除了JDesktopPane,JLayeredPane以及JViewport。
  • Double buffering:在默认情况下,所有的Swing组件会将他们的绘制操作重复缓存到一个完整的容器层次结构所共享的缓冲区中;也就是,在一个窗体内的所有组件。这极大的改善了绘制性能,因为当允许双缓冲时(通过doubleBuffered属性),只有一个屏幕更新绘制。

JComponent的public void revalidate()方法也提供绘制支持。当这个方法被调用时,组件的高级容器会验证其本身。这与AWT的直接调用高级组件的revalidate()方法不同。

Swing组件绘制加强的最后一个方面就是RepaintManager类。

RepaintManager类

RepaintManager类负责保证当前显示的Swing组件之上的重绘请求的高效,确保当一个区域无效时只更新屏幕的最小“脏”区域。

尽管不能进行自定义,RepaintManager是公开并且提供了一个静态的安装例程来使用自定义管理器:public static void setCurrentManager(RepaintManager manager)。要获得当前的管理器,只需要调用public static void currentmanager(JComponent)方法。参数通常为null,除非我们已经自定义了管理器来提供组件级别的支持。一旦我们拥有管理器在,我们可以做的一件事就是将屏幕缓冲区获取为图像。因为缓冲区就是实际显示在屏幕上的内容,这可以使得我们高效的实现窗体内部的屏幕复制。

Component comp = ... 
RepaintManager manager = RepaintManager.currentManager(null);
Image htmlImage = manager.getOffscreenBuffer(comp, comp.getWidth(),
  comp.getHeight());
// or
Image volatileImage = manager.getVolatileOffscreenBuffer(comp, comp.getWidth(),
  comp.getHeight());
 

表4-1显示了RepaintManager的两个属性。他可以使得我们禁止一个组件(层次结构)的所有绘制操作的双缓冲,并且设置最大的双缓冲尺寸,默认为终端用户的屏幕尺寸。

RepaintManager属性

属性名 
数据类型 

可访问性

doubleBufferingEnabled 
boolean 

读写

doubleBufferMaximumSize
Dimension 

读写

尽管很少实现,提供我们自己的RepaintManager子类确实允许我们自定义屏幕脏区域的绘制机制,或者是当绘制完成时的最少跟踪。重写下面四个方法的一个可以允许我们自定义机制:

public synchronized void addDirtyRegion(JComponent component, int x, int y,
  int width, int height)
public Rectangle getDirtyRegion(JComponent component)
public void markCompletelyClean(JComponent component)
public void markCompletelyDirty(JComponent component)
 

UIDefaults类

UIDefaults类表示为当前的观感所安装的包含显示设置的查询表,例如JList中所用的字体,在JTree节中所显示的颜色或图标。UIDefaults的使用将会在第20章探讨Java可插拨的观感体系结构时进行详细讨论。在这里,我们只是简要介绍UIDefaults表。

当我们创建一个组件时,组件会自动的请求UIManager在UIDefaults表中查找组件所用的当前设置。大多数的颜色,字体相关的组件设置,以及其他的一些与颜色与字体无关的设置,都是可配置的。如果你不喜欢一个特定的设置,我们可以简单的通过更新UIDefaults查询表中的相应项目进行修改。

首先我们需要知道我们希望修改的UIDefaults设置的名字。我们可以在本书的附录A中找到这些设置名字,在这个附录中包含J2SE 5.0中预定义观感的所有已知设置的完整列表。(由于发行版本的不同会略有不同。)另外,包含有每个组件描述的是一个包含UIResource相关属性元素的表。(要查找本书中特定组件部分,请查看内容表或是索引。)

一旦我们知道了设置的名字,我们可以使用UImanager的public static void put(Object key, Object value)方法来存放一个新的设置,其中key是键值字符串。例如,下面的代码会将新创建的按钮的背景颜色改变黑色,而前景色改变红色:

UIManager.put("Button.background", Color.BLACK);
UIManager.put("Button.foreground", Color.RED);
 

获取UIResource属性

如果我们正在创建自己的组件,或者是我们只需要查看当前的设置值,我们可以请求UIManager。尽管public static Object get(Object key)方法是最为通用的,却需要我们将返回值转换为合适的类型。相对应的,我们可以下列更为特定的getXXX()方法,这些方法会为我们执行錾,从而返回合适的类型:

public static boolean getBoolean(Object key)
public static Border getBorder(Object key)
public static Color getColor(Object key)
public static Dimension getDimension(Object key)
public static Font getFont(Object key)
public static Icon getIcon(Object key)
public static Insets getInsets(Object key)
public static int getInt(Object key)
public static String getString(Object key)
public static ComponentUI getUI(JComponent target)
 

这是一组接受Locale参数的重载的方法集合。

客户属性

除了UIManager维护一个key/value对设置以外,每一个组件实例还维护一个自己的key/value对集合。这对于维护一个不同于一定观感的组件或者是维护与一个组件关联的数据而不需要新类或是方法来存储这些数据的情况十分有用。

public final void putClientProperty(Object key, Object value)
public final Object getClientProperty(Object key)
 

例如,JTree类具有一个属性通过Metal观感来连接线风格或是显示JTree中的节点。因为设置特定于一个观感,因而向树API中添加一些内容并不合理。相反,我们可以通过下面的代码在一个特定的树实例上设置属性:

tree.putClientProperty("JTree.lineStyle", "None")

然后,当观感是默认的Metal时,树的节点将会用线连接。如果安装了其他的观感,客户属性就会被忽略。图4-2显示具有与不具有线的树。

Swing_4_2

4.1.2 JComopnent属性

我们已经了解了一些不同的JComponent子类所共享的属性。现在是了解JavaBean属性的时候了。表4-2显示了JComponent所定义的完整属性列表,包括由AWT Container为戌Component类所继承的属性。

JComponent属性

属性名 数据类型 组件访问 容器访问 JComponent访问
accessibleContext AccessibleContext

只读

N/A

只读

actionMap

ActionMap

N/A

N/A

读写

alignmentX

float

只读

只读

读写

alignmentY

float

只读

只读

读写

ancestorListeners

AncestorListener[]

N/A

N/A

只读

autoscrolls

boolean

N/A

N/A

读写

background

Color

读写绑定

N/A

只写

backgroundSet

boolean

只读

N/A

N/A

border

Border

N/A

N/A

读写绑定

bounds

Rectangle

读写

N/A

N/A

colorModel

ColorModel

只读

N/A

N/A

componentCount

int

N/A

只读

N/A

componentListeners

ComponentListener[]

只读

N/A

N/A

componentOrientation

ComponentOrientation

读写绑定

N/A

N/A

componentPopupMenu

JPopupMenu

N/A

N/A

读写

components

Component[]

N/A

只读

N/A

containerListeners

ContainerListener[]

N/A

只读

N/A

cursor

Cursor

读写

N/A

N/A

cursorSet

boolean

只读

N/A

N/A

debugGraphicsOptions

int

N/A

N/A

读写

displayable

boolean

只读

N/A

N/A

doubleBuffered

boolean

只读

N/A

读写

dropTarget

DropTarget

读写

N/A

N/A

enabled

boolean

读写

N/A

只写绑定

focusable

boolean

读写绑定

N/A

N/A

focusCycleRoot

boolean

N/A

读写绑定

N/A

focusCycleRootAncestor

Container

只读

N/A

N/A

focusListeners

FocusListener[]

只读

N/A

N/A

focusOwner

boolean

只读

N/A

N/A

focusTraversalKeyEnabled

boolean

读写

N/A

N/A

focusTraversalPolicy

FocusTraversalPolicy

N/A

读写绑定

N/A

focusTraversalPolicyProvider

boolean

N/A

读写绑定

N/A

focusTraversalPolicySet

boolean

N/A

只读

N/A

font

Font

读写绑定

只写

只写

fontSet

boolean

只读

N/A

N/A

foreground

Color

读写绑定

N/A

只写

foregroundSet

boolean

只读

N/A

N/A

graphics

Graphics

只读

N/A

只读

graphicsConfiguration

GraphicsConfiguration

只读

N/A

N/A

height

int

只读

N/A

N/A

hierarchyBoundsLIsteners

HierarchyBoundsListener[]

只读

N/A

N/A

hierarchyListeners

HierarchyListener[]

只读

N/A

N/A

ignoreRepaint

boolean

读写

N/A

to
分享到:
评论

相关推荐

    最全面的swing文本编辑器

    Swing 是 Java GUI 开发的重要库,它提供了一组组件和工具来创建桌面应用程序。"最全面的Swing文本编辑器"是一个利用Java Swing构建的高级文本编辑器,旨在提供比标准记事本更丰富的功能,如插入图片、鼠标绘图等。...

    introduction to gui programming with java swing

    ### Swing组件与容器 Swing提供了多种预定义的组件,如按钮(JButton)、文本框(JTextField)、复选框(JCheckBox)、单选按钮(JRadioButton)、滑动条(JSlider)、菜单(JMenu)等,以及容器如面板(JPanel)、...

    javaswing电子英汉词典(idea和eclipse都能打开).zip

    Swing是完全由Java编写的,它提供了一个轻量级的组件模型,与Java AWT(Abstract Window Toolkit)相比,Swing组件具有更好的外观和更多的定制选项。Swing组件通常比AWT组件更现代,且在不同的操作系统上有一致的...

    基于JavaSwing办公自动化系统(源代码+SQL+论文+外文翻译)

    1. **JavaSwing组件**:JavaSwing提供了一系列组件,如JButton(按钮)、JLabel(标签)、JTextField(文本框)、JTextArea(文本区域)、JTable(表格)等,用于构建用户交互界面。这些组件允许用户进行数据输入、...

    java swing一篇轻松学习(高考后可以自学)对照编码

    总的来说,学习Java Swing需要理解GUI组件、事件处理、布局管理和线程安全等核心概念。通过实际编写代码,结合本文档提供的例子,你将能够逐步掌握Swing,并能创建出美观且功能丰富的桌面应用程序。记得在实践中不断...

    java 简易翻译系统

    在这个翻译系统中,Swing被用来设计和实现用户界面,包括文本输入框、按钮、标签等组件,用户可以通过这些组件与程序进行交互。 3. **用户界面设计**:良好的用户界面设计对于任何应用都是至关重要的。在这个系统中...

    swing界面的屏幕取词

    标题中的“Swing界面的屏幕取词”是指在Java Swing环境下实现的一种屏幕选取单词并进行翻译或查询的功能。Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和API,允许开发者创建桌面应用程序。屏幕...

    一个Java语言翻译程序,输入英文翻译到汉语,通过加载自己编写的词汇库进行匹配,能进行一些日常语的翻译.zip

    3. **翻译逻辑**:核心的翻译算法会遍历词汇库,查找输入英文单词或短语的对应汉语翻译。如果词汇库支持模糊匹配或词性转换,这可能涉及到更复杂的自然语言处理技术。 4. **错误处理与未匹配词的处理**:对于词汇库...

    java调用google的翻译实例

    此方法实现了核心的翻译逻辑: - 首先根据选择的语言方向确定源语言和目标语言。 - 使用`Translate.translate`方法进行翻译,并将结果展示在`toTextArea`文本框中。 - 如果发生异常,则通过日志记录器记录错误信息。...

    Core Java.JAVA核心技术(中文版)

    8. **Java Swing与JavaFX图形界面**: - **组件与布局管理**:创建窗口、添加控件,理解各种布局管理器如FlowLayout、GridLayout、BorderLayout等。 - **事件处理**:监听用户交互,如按钮点击、键盘输入等事件。 ...

    Java Swing Database Components-开源

    `HomeDatabase.jar`可能是一个示例应用或者一个包含核心数据库操作的库,它展示了如何在Swing应用中使用这些数据库组件。这可以帮助开发者快速上手,并理解如何在实际项目中整合这些组件。 `lgpl.txt`和`MultiShow_...

    Java核心技术·卷2:高级特征(原书第9版)

    在图形用户界面编程方面,作者会详细介绍Swing组件和布局管理器,以及如何创建复杂的用户界面和响应用户交互。最后,在数据库连接方面,书中会讲解JDBC的基本使用方法和高级特性,包括预处理语句、事务处理以及连接...

    《Java游戏开发》的中文翻译

    虽然代码示例基于较旧的JDK1.4.2,但其核心原理和编程思想对于现代Java游戏开发仍然具有指导价值。 首先,Java作为游戏开发语言的优势在于其跨平台性、强大的类库支持以及成熟的开发环境。Java的垃圾回收机制和自动...

    ant-1.6.5集合包

    5. **ant-swing-1.6.5.jar**:Ant Swing库提供了与Java Swing组件交互的任务,如创建和操作GUI应用程序。例如,它可以用于打开或操作Swing应用程序的窗口、组件等。 这些JAR文件共同构成了Ant 1.6.5的完整环境,...

Global site tag (gtag.js) - Google Analytics