TableCellRenderer和DefaultTableCellRenderer

 
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
 

你可能感兴趣的:(object,String,table,border,button,interface)