您的位置:首页 > 其它

TableCellRenderer和DefaultTableCellRenderer

2006-12-19 23:54 253 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐