TableCellRenderer用法实践(一)

     Swing组件根据其所操作的数据类型分为两种,一种是标量数据类型的组件,一类是复合数据类型的组件。标量数据类型的组件操作的是基本类型的数据,如字符串、布尔、数字等,此类型组件包括JTextField、JCheckBox、JLabel、JButton等。复合数据类型的组件操作的是诸如向量、矩阵和非线形等类型的数据。向量数据类型的组件有JComboBox、JList,矩阵数据类型的组件有JTable,非线形数据类型的组件如 JTree。
     为更形象地展现各种类型的数据,复合数据类型的组件往往采用标量数据类型组件来表现每种数据元素。比如JTable的某一列数据是字符串类型,那么该列的单元格往往用JLabel方式展现每个字符串;如果一列数据是布尔类型,那么该列的单元格往往用JCheckBox方式展现每个布尔值。
     如何实现复合数据类型的组件的渲染呢?最直接的是在paint方法中一个一个地根据数据类型画出每一个组件,但这种方法很显然代码复用率很低,大量重复了相应标量型组件的代码,代码的维护和同步会非常困难,也不容易实现皮肤切换。
     为解决此问题,Swing体系中提出了所谓渲染器(Renderer)的概念,其核心思想是使用接口,封装和复用已有标量型组件的渲染代码,降低代码重复率,提高组件的可扩展性。

     JTable负责管理表格的可视外观,在绘制每个单元格时,调用getCellRenderer(int row,int col)获得当前单元格的渲染器,即得到一个Component,然后将其绘制展现。TableCellRenderer是一个接口,只有一个方法:

 

Component getTableCellRendererComponent(JTable table,
                                        Object value,
                                        boolean isSelected,
                                        boolean hasFocus,
                                        int row,
                                        int column)

     

      其中,row和column标识一个单元格。也就是说,可以根据row和column的不同(单元格也就不同),获得不同的填充组件,这样只需要在该方法内进行相应的逻辑判断。例如,可以实现同一列的不同行渲染效果不同,可以是单元格的背景色不同,或者是单元格内的字体不同诸如此类。下面的列子是,实现偶数行被划一道行线的效果:

 

                           

 

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要设置 JTable 某一单元格为只读,可以通过自定义 TableCellRendererTableCellEditor 来实现。 首先,定义一个只读的 TableCellRenderer,例如: ``` class ReadOnlyTableCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setEnabled(false); // 设置单元格不可编辑 return this; } } ``` 该 Renderer 会在表格的某一单元格需要显示时被调用,将该单元格设为不可编辑。 然后,定义一个只读的 TableCellEditor,例如: ``` class ReadOnlyTableCellEditor extends DefaultCellEditor { public ReadOnlyTableCellEditor() { super(new JTextField()); setClickCountToStart(1); // 单击一次即可编辑 } public boolean isCellEditable(EventObject anEvent) { return false; // 返回 false,单元格不可编辑 } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return null; // 返回 null,表示单元格不可编辑 } } ``` 该 Editor 会在用户对某一单元格进行编辑时被调用,但是它会判断该单元格是否可编辑,如果不可编辑则返回 null,表示不进行编辑操作。 最后,在需要设置某一单元格为只读时,调用 JTable 的 setCellRenderer 和 setCellEditor 方法,例如: ``` JTable table = new JTable(); table.setDefaultRenderer(Object.class, new ReadOnlyTableCellRenderer()); // 将整个表格设为只读 table.getColumnModel().getColumn(1).setCellRenderer(new ReadOnlyTableCellRenderer()); // 将第 2 列设为只读 table.getColumnModel().getColumn(2).setCellEditor(new ReadOnlyTableCellEditor()); // 将第 3 列设为只读 ``` 以上代码将第 2 列设为只读 Renderer,第 3 列设为只读 Editor,可以根据实际需求进行选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值