[翻译]核心Swing组件(一)
在第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()行为。
属性名?
数据类型?可访问性
doubleBufferingEnabled?
boolean?读写
doubleBufferMaximumSize
Dimension?读写
尽管很少实现,提供我们自己的RepaintManager子类确实允许我们自定义屏幕脏区域的绘制机制,或者是当绘制完成时的最少跟踪。重写下面四个方法的一个可以允许我们自定义机制:
4.1.2 JComopnent属性我们已经了解了一些不同的JComponent子类所共享的属性。现在是了解JavaBean属性的时候了。表4-2显示了JComponent所定义的完整属性列表,包括由AWT Container为戌Component类所继承的属性。
JComponent属性
属性名数据类型组件访问容器访问JComponent访问accessibleContextAccessibleContext只读
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