转载:http://blog.sina.com.cn/s/blog_661a3fce0100mske.html
最近不少朋友问我TableCellRenderer和TableCellEditor的用法,趁今天周末有空写了几个麻雀虽小五脏俱全的例子供大家参考。

简单来说:

TableCellRenderer就是用来绘制展示当前cell单元数值内容的,你可以用文字、数值或者图片来表示内容,当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。
TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以 TableCellEditor除了具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框甚 至通过按钮弹出更复杂的对话框让用户进行输入编辑。
以下是在cell中嵌入start、stop两个按钮的表格,注意这里的renderer只是用来显示效果,并没有进行交互动作,真正进行动作的是当你将鼠标点击在cell上时,JTable定位上去的editor,所以不要徒劳在renderer上做点击事项处理,renderer是不会接受到交互事项的,renderer只是个画笔,你看到的start、stop按钮只是这个画笔画出来的内容,是虚的并没有真正的组件在上面。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.table.*;
public class TableTest1 extends JFrame {
 JTable table;
 String[] states = new String[]{"stop", "stop", "stop"};
 
 // model
 class TableModel extends AbstractTableModel{
  public int getColumnCount() {
   return 2;
  }
  public int getRowCount() {
   return states.length;
  }
  public Object getValueAt(int rowIndex, int columnIndex) {
   if(columnIndex == 0){
    return states[rowIndex];
   }
   return null;
  }
     public String getColumnName(int columnIndex) {
   if(columnIndex == 0){
    return "state";
   }else{
    return "operate";
   }
     }
     public boolean isCellEditable(int rowIndex, int columnIndex) {
   if(columnIndex == 0){
    return false;
   }else{
    return true;
   }
     }
 }
 
 // cell editor
 class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
  int row;
  JTable table;
  JPanel panel;
  JButton start;
  JButton stop;
  Editor(){
   panel = new JPanel();
   panel.setLayout(new GridLayout(1, 2));
   start = new JButton("start");
   stop = new JButton("stop");
   start.addActionListener(this);
   stop.addActionListener(this);
   panel.add(start);
   panel.add(stop);
  }
     public Object getCellEditorValue() {
         return null;
     }
     public Component getTableCellEditorComponent(JTable table,
                                                  Object value,
                                                  boolean isSelected,
                                                  int row,
                                                  int column) {
      this.table = table;
      this.row = row;
      return panel;
     }
    
  public void actionPerformed(ActionEvent e) {
   if(e.getSource() == start){
    states[row] = "start";
   }else{
    states[row] = "stop";
   }
   ((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
  }
  
 }
 
 // cell render
 class Renderer extends JComponent implements TableCellRenderer{
  JPanel panel;
  JButton start;
  JButton stop;
  Renderer(){
   panel = new JPanel();
   panel.setLayout(new GridLayout(1, 2));
   start = new JButton("start");
   stop = new JButton("stop");
   panel.add(start);
   panel.add(stop);
  }
  public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {
   return panel;
  }
 }
 
 public TableTest1(){
  super("renderer and editor self-existent");
  table = new JTable(new TableModel());
  TableColumn tableColumn = table.getColumnModel().getColumn(1);
  tableColumn.setCellRenderer(new Renderer());
  tableColumn.setCellEditor(new Editor());
  
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        this.setSize(500, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 public static void main(String[] args) {
  new TableTest1().show();
 }
}

转载于:https://www.cnblogs.com/gwq369/p/5363193.html

TableCellRenderer和TableCellEditor(一)相关推荐

  1. Eclipse里如何指定目标JRE版本

    当eclipse指定的JRE版本较老时,编译程序会报java.lang.UnsupportedClassVersionError.那么我们就 需要修改指定较新的JRE版本了 可能你也感兴趣的文章: 浅 ...

  2. JTable单元格放自定义控件(一)-如何在JTable的单元格放JPanel

    原文链接:http://blog.sina.com.cn/s/blog_7f1c8c710101hdpf.html 最近自己尝试着模仿着实现一款非常有名的进销库存管理系统(智慧记)里面的一个功能.功能 ...

  3. TableCellRenderer TableCellEditor(三)

     上文实现了renderer复用editor的功能,那么反过来editor是否也可以复用renderer的功能呢?而且第一篇提到"通过Java2D来绘制各种天花乱坠的效果"如何实现 ...

  4. java显示链表在jtable上输出_jtable的使用精华

    jtable的使用精华 众所皆知,java中没有像c#中的DATAGRID似的数据显示控件,所以不能直接显示数据,只有通过自己定制表格才能显示数据,请个位来讨论一下java中用来显示数据jtable的 ...

  5. DefaultTableCellRenderer

    首页 小组 读书 电影 音乐 同城 九点 书籍 电影 音乐 小组 成员 活动 搜索 <script type="text/javascript"> Douban.pre ...

  6. void addColumn(TableColumn aColumn)

    void addColumn(TableColumn aColumn) 将 aColumn 追加到此 JTable 的列模型所保持的列数组的结尾. void addColumnSelectionInt ...

  7. Java Swing 开发之JTable中在添加组件(JCheckBox)

    2019独角兽企业重金招聘Python工程师标准>>> 首先是创建表格 JTable demoTable= new JTable(); DefaultTableModel dtmDe ...

  8. JavaSwing编程总结

    都2021年了,还有人用JavaSwing?这只是我的一个爱好,我喜欢做界面开发,但是又只有Java还学的不错,大部分Java书籍中对JavaSwing介绍的都比较一般,我便找了<Java2图形 ...

  9. 用Java写一个PC端的WIFI-ADB管理软件

    废话 一直在用android studio做android开发,偶然一次机会接触到了wifi adb,试了好几个支持android studio的插件,各有优缺点,有一个本来用着好好的,突然就用不了, ...

最新文章

  1. js 自定义可编辑table并获取输入值
  2. 类似 Google Tips 页面的卡片式提示和翻转特效
  3. php接收dup,TCP与DUP简单对比
  4. 延长笔记本电脑寿命的四个简单方法
  5. Linux 下的文件管理管理系统中的输出输入
  6. PAT_B_1090_C++(25分)
  7. oracle一个表拆成多个表,oracle – 在oracle表中将多个以逗号分隔的值拆分为多行...
  8. 【剑指offer】_11整数中1出现的次数
  9. 面向过程和面向对象的联系和区别
  10. 向量加减法首尾规律_向量加减口诀首尾相接
  11. 【ThinkPHP5.0RC2吃螃蟹之】关于ThinkPHP5.0的渲染模板输出
  12. Ubuntu Server Download
  13. 线上问题处理1---CPU飙高问题定位
  14. 世界五大黑客:代码创造他们,他们改变世界!...
  15. 【力扣-动态规划入门】【第 4 天】45. 跳跃游戏 II
  16. MySQL 基础学习笔记
  17. 计算机第一启动设置u盘启动,如何进入bios,设置优盘为电脑第一启动顺序
  18. javascript数组(array)的常用方法(shift/unshift/pop/push/concat/splice/reverse/sort/slice/join)
  19. 【GPU精粹与Shader编程】(四) 《GPU Gems 2》全书核心内容提炼总结 · 上篇
  20. 将svg图标转换成iconfont图标

热门文章

  1. python3将列表当做堆栈使用
  2. mybatis配置文件不在resources目录下时需进行的额外配置方法
  3. VMware虚拟机中调用本机摄像头详解
  4. centos7 开机延迟几分钟后自启动
  5. pdf去除水印方法!【亲测可用】
  6. input python_python input 详解
  7. 2.4.1 算术逻辑单元ALU与加法器(串行加法器、并行加法器、全加器)
  8. 内存位置访问无效_万字长文——java内存模型之volatile深入解读
  9. 如何查看linux下串口信息
  10. java 本地发送邮件_java在本地发送邮件可以,在服务器发送报错