1、昨晚睡的最好,结果,今天上午困的一塌糊涂,所以精神的好坏和睡觉的多少没有必然的关系(至少在短时间内是这样的)。
2、我答应了老婆,一定要看完JTable,所以要完成今天的任务
综上所述,今天有足够的理由晚睡觉,以便看完这两小节。还好,基本完成了。不过还有些东西不理解,到底DefaultTableCellRenderer在对待Boolean类型是返回的是JCheckBox还是JLabel。试了好几次都是JLabel,但是书上怎么说是JCheckBox呢,好了,这个问题先留一留吧,发帖,回家睡觉。
18.1.8 The TableCellRenderer interface
Abstract interface javax.swing.table.TableCellRenderer
TableColumn的cell里的数据是由renderer来展示的,而这个接口的作用就是用来描述这个展示数据之用的renderer的。每个TableColumn都有一个与之相关的TableCellRenderer,TableColumn的这个TableCellRenderer可以通过TableColumn的getCellRenderer()/setCellRenderer()来访问(注意:这里是通过TableColumn的方法,而不是TableModel或者JTable的方法。反正我是经常混淆,应该还是不理解
J)。接口TableCellRenderer里面只有一个方法:getTableCellRendererComponent(),这个方法期望的返回值是一个Component,而返回这个Component就是用来实际的render一个cell之用的。方法getTableCellRendererComponent()有使用以下的参数:
• JTable table:
要被
render
的
cell
所属的那个
table
,即
cell
所在
table
• Object value
:要被
render
的
cell
内的数据
• boolean isSelected
:如果此
cell
想选中高亮,则为
true
,否则
false
• boolean hasFocus
:指定给定的这个
cell
是否有焦点
(
如果这个
cell
上次被点击了,则
hasFocus
为
true. true if it was clicked lase)
• int row
:要被
render
的
cell
的行索引,如果想
render tableHeader
,则为
-1
• int column
:被
render
的
cell
的列索引
Renderer
的作用就是让我们可以通过要展示的数据,采用合适的方式
(
这里也就是说用合适的组件来显示我们的数据,比方说,我们希望用
JCheckBox
来显示
true
、
false
,用
JComboBox
来显示
5
个选项等等
)
来显示我们的数据。举例来说,我们要想显示一个
Color
,那么我们就可以返回一个
JLabel
的子类,然后用这个
JLabel
的子类来利用给定的
Color
划出一个矩形。和
JTree
的
TreeCellRenderer getTreeCellRendererComponent()
方法相似,
TableCellRenderer
接口的这个
getTreeCellRenderer()
方法在不同的列、不同的行,甚至基于不同的
cell
可以返回不同
render
之用的组件。和
JTree
、
JList
一样,返回的
renderer
用的组件仅仅是用来显示之用的,绝对不可以编辑。
注意:这里的
row, column
参数指的是
TableModel
中的数据的位置,而不是
TableColumnModel
中某个
cell
的位置。
当一个
JTable
的
UI
代理重绘
table
的某个特定区域时,
UI
代理首先会查询这个
table
来决定每个需要重绘的
cell
用的是什么
renderer
。这个过程是这样的:
1、
首先调用这个
JTable
的
getCellRenderer(row, column)
2、
然后对要重绘的
cell
,调用这个
cell
所在的列的
TableColumn
的
getCellRenderer()
从而得到这个
TableColumn
所关联的
TableCellRenderer
3、
然后再调用这个
TableCellRenderer
的方法
getTableCellRendererComponent()
如果对于某个
TableColumn
,这个
TableColumn
没有关联特定的
renderer(
其实这正是默认的情况
)
,那么
TableModel
的
getColumnClass()
方法根据此
cell
的数据的类型来递归的决定要返回什么样的
renderer
,所谓的递归是这样的意思:对于
cell
的数据的类型,找不到
class-based
的
renderer
,那么
TableModel
的
getColumnClass()
方法就会在返回这个
cell
的数据的父类。这个过程最终绘在
Object
时结束,而这个
Object
就是
DefaultTableCellRenderer
所默认使用的类的类型
如果
cell
的数据的类型是
Icon
、
Number(Number
是
BigDecimal, BegInteger, Byte, Double, Float, Interger, Long
以及
Short
的父类
)
,那么这个
cell
所用的
Renderer
也是
DefaultTableCellRenderer
。如果
cell
的数据的类型是
Boolean
,那么这个
cell
的
Renderer
就是
JCheckBox
。我们可以通过
JTable
的
setDefaultRenderer()
方法来给这个
table
指定新的某个的
Renderer
。请一定记住:只有在没有给
TableColumn
,或者是某个
cell
显式指定
renderer
的时候,
class-based
的
renderer
才会被用到。
18.1.9
DefaultTableCellRenderer
class javax.swing.table.DefaultTableCellRenderer
这个类是
TableCellRenderer
接口的默认实体实现。
DefaultTableCellRenderer
继承自
JLabel
,用来默认的作为
Number, Icon
,
Boolean
以及
Object
数据类型的
class-based
的
renderer
。这个类有两个
private
的
Color
类型的变量,这两个变量用来在这个
cell
允许编辑而且这个
cell
当前拥有焦点时储存前景背景色。这两个
color
可以通过
DefaultTableCellRenderer
的
setBackground()
和
setForeground()
方法来覆盖掉。
一个
protectd
的
Border
属性用来在当这个
cell
当前没有焦点时来储存这个
cell
的
border
。默认情况下,整个
border
时
EmptyBorder
,这个
Border
的
top
、
button
距离都是
1
,
left
、
rigth
距离都是
2
。不过,不幸的是,
DefaultTableCellRenderer
没有提供方法来更改这个
border
DefaultTableCellRenderer
利用传给
getTableCellRendererComponent()
方法的
value
参数,然后利用这个
value
的
toString()
方法,来得到一个
String
,然后将此
Label
的
text
设置为此
String
。所有的
JLabel
的属性在
render
时都可以使用。我们可以对这个
renderer
来作所有的我们可以对
JLabel
可以作的事情,比方说,我们可以指定这个
renderer
的
tooltip
以及是否可用状态等等
注意:
JTable
就像其他的任何组件一样,可以用自己的
tooltip
。但是
table
的
renderer(
这里指的是设置了
renderer
的那些
cell
的
renderer)
的
tooltip
比
table
本身的
tooltip
拥有更高的优先权,如果
table
,以及
table
的
renderer
都设置了
tooltip
,那么当鼠标落到用了
renderer
的那个
cell
上时,显示的是
renderer
的
tooltip
。