您的位置:首页 > 其它

TablecellRenderer和TableCellEditor

2015-08-06 17:57 423 查看
TableCellRenderer就是用来绘制展示当前cell单元数值内容的,你可以用文字、数值或者图片来表示内容,当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。

TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以TableCellEditor除了具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框甚至通过按钮弹出更复杂的对话框让用户进行输入编辑。

 

他们都是JPanel的子类

public Component getTableCellEditorComponent(JTable arg0, Object arg1,

   boolean arg2, int arg3, int arg4) 

 {

  // TODO Auto-generated method stub

  return null;

 }

是TableCellEditor主要方法  this

如果添加JButton  都是在这个基础的JComponent上面添加的组件

 

TableCellRenderer也是类似

------------------------------------------------

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.table.*;

//主类
//@SuppressWarnings("unchecked")

public class TryJTable extends JFrame 

{

    private static final long serialVersionUID = 1L;

    //创建自定义表格模型对象

    MyTableModel dtm=new MyTableModel();

    //创建JTable对象

    JTable jt=new JTable(dtm);

    //将JTable封装进滚动窗格

    JScrollPane jsp=new JScrollPane(jt);    

    //自定义的表格模型

    private class MyTableModel extends AbstractTableModel

    {

        private static final long serialVersionUID = 1L;

        //创建表示各个列类型的类型数组

        Class[] typeArray=

              {Object.class,Double.class,Boolean.class,Icon.class,Color.class};

        //创建列标题字符串数组

        String[] head={"Object","Number","Boolean","Icon","Color"};

        //创建初始表格数据

        Object[][] data={{"这里是字符串1",new Integer(20),new Boolean(true),

                            new ImageIcon("D:/p1.gif "),Color.black},

                        {"这里是字符串2",new Double(12.34),new Boolean(false),

                        new ImageIcon("D:/p2.gif "),Color.darkGray},

                        {"这里是字符串3",new Integer(125),new Boolean(true),

                        new ImageIcon("D:/p3.gif"),Color.white}};

        //重写getColumnCount方法

        public int getColumnCount()

        {

            return head.length;

        }

        //重写getRowCount方法    

        public int getRowCount()

        {

            return data.length;

        }

        //重写getColumnName方法

        public String getColumnName(int col)

        {

            return head[col];

        }

        //重写getValueAt方法

        public Object getValueAt(int r,int c)

        {

            return data[r][c];

        }

        //重写getColumnClass方法

        public Class getColumnClass(int c)

        {

            return typeArray[c];

        }

        //重写isCellEditable方法

        public boolean isCellEditable(int r,int c)

        {

            return true;

        }

        //重写setValueAt方法

        public void setValueAt(Object value,int r,int c)

        {

            data[r][c]=value;

            //

            this.fireTableCellUpdated(r,c);

        }

    }

    //自定义的绘制器

    private class MyCellRendererForColorClass 

                    extends JLabel implements TableCellRenderer

    {

        private static final long serialVersionUID = 1L;

        //定义构造器

        public MyCellRendererForColorClass ()

        {

            //设置标签为不透明状态

            this.setOpaque(true);

            //设置标签的文本对齐方式为居中

            this.setHorizontalAlignment(JLabel.CENTER);

        }

        //实现获取呈现控件的getTableCellRendererComponent方法

        public Component getTableCellRendererComponent(JTable table,Object value,

                           boolean isSelected,boolean hasFocus,int row,int column)

        {            

            //获取要呈现的颜色

            Color c=(Color)value;

            //根据参数value设置背景色

            this.setBackground(c);

            //设置前景色为背景色反色

            this.setForeground(new Color(255-c.getRed()

                                ,255-c.getGreen(),255-c.getBlue()));

            //设置标签中显示RGB的值

            this.setText("["+c.getRed()+","+c.getGreen()+","+c.getBlue()+"]");

            //将自己返回

            return this;    

        }

    }    

    //声明Color类型的自定义编辑器

    class MyEditorForColorClass extends AbstractCellEditor 

            implements TableCellEditor,ActionListener

    {

        private static final long serialVersionUID = 1L;

        //定义Color变量

        Color c;

        //定义对话框变量

        JDialog jd;

        //创建一个按扭

        JButton jb=new JButton();

        //创建JColorChooser对象

        JColorChooser jcc=new JColorChooser();

        //声明一个常量

        public static final String EDIT="edit";

        //定义构造器

        public MyEditorForColorClass()

        {

            //为按扭注册监听器

            jb.addActionListener(this);

            //设置此按扭的动作命令

            jb.setActionCommand(EDIT);

            //获取颜色选择器

            jd=JColorChooser.createDialog(jb,"选择颜色",true,jcc,this,null);

        }

        //实现actionPerformed方法

        public void actionPerformed(ActionEvent e)

        {

            //测试获得的动作命令是否等于EDIT常量

            if(e.getActionCommand().equals(EDIT))

            {

                //设置按扭的背景颜色

                jb.setBackground(c);

                //设置前景色为背景色反色

                jb.setForeground(new Color(255-c.getRed()

                                ,255-c.getGreen(),255-c.getBlue()));

                //设置按钮中显示RGB的值

                jb.setText("["+c.getRed()+","+c.getGreen()+","+c.getBlue()+"]");               

                //设置颜色选择器的颜色

                jcc.setColor(c);

                //设置颜色选择器可见

                jd.setVisible(true);

                //通知所有监听器,以延迟方式创建事件对象

                this.fireEditingStopped();            

            }

            else

            {

                //获取颜色

                c=jcc.getColor();

            }

        }

        //定义getCellEditorValue方法返回颜色值

        public Object getCellEditorValue()

        {

            return c; 

        }

        //重写getTableCellEditorComponent方法

        public Component getTableCellEditorComponent(JTable table,

            Object value,boolean isSelected,int row,int column)

        {

            c=(Color)value;

            return jb;      

        }

    }

    //声明Icon类型的自定义编辑器

    class MyEditorForIconClass extends AbstractCellEditor 

            implements TableCellEditor,ActionListener

    {

        private static final long serialVersionUID = 1L;

        //定义Icon变量

        Icon icon;

        //创建一个按扭

        JButton jb=new JButton();

        //创建JColorChooser对象

        JFileChooser jfc=new JFileChooser();

        //声明一个常量

        public static final String EDIT="edit";

        //定义构造器

        public MyEditorForIconClass()

        {

            //为按扭注册监听器

            jb.addActionListener(this);

            //设置此按扭的动作命令

            jb.setActionCommand(EDIT);

        }

        //实现actionPerformed方法

        public void actionPerformed(ActionEvent e)

        {

            //测试获得的动作命令是否等于EDIT常量

            if(e.getActionCommand().equals(EDIT))

            {

                //设置按扭的图标

                jb.setIcon(icon);

                //显示文件选择器对话框

                jfc.showOpenDialog(jb);

                //获取新图片

                if(jfc.getSelectedFile()!=null)

                {

                    icon=new ImageIcon(jfc.getSelectedFile().getAbsolutePath());

                }                

                //通知所有监听器,以延迟方式创建事件对象

                this.fireEditingStopped();            

            }

        }

        //定义getCellEditorValue方法返回图标

        public Object getCellEditorValue()

        {

            return icon; 

        }

        //重写getTableCellEditorComponent方法

        public Component getTableCellEditorComponent(JTable table,

            Object value,boolean isSelected,int row,int column)

        {

            icon=(Icon)value;

            return jb;      

        }

    }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wzh32/archive/2009/05/01/4141543.aspx

-----------------------------------------------------

import java.awt.*;   

  

import javax.swing.*;   

import javax.swing.table.*;   

  

public class RoundColorTable extends JFrame

 {   

     private String[] colname = {"第1列","第2列","第3列","第4列","第5列"}; //表头信息   

     private String[][] data = new String[10][5]; //表内容    

     private JTable table;   

     public RoundColorTable() {   

         //表内容赋值   

         for(int i = 0; i < 10; i++) {   

             for(int j = 0; j < 5; j++) {   

                 data[i][j] = "( " + (j+1) + ", " + (i+1) + " )";   

             }   

         }   

         table = new JTable(new DefaultTableModel(data,colname));   

         TableCellRenderer tcr = new ColorTableCellRenderer();   

         table.setDefaultRenderer(Object.class,tcr);//为JTable增加渲染器,因为是针对于表格中的所有单元格,所有用Object.class   

         add(new JScrollPane(table),BorderLayout.CENTER);   

         setVisible(true);   

         setSize(500,300);   

         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   

     }   

     public static void main(String args[]) {   

         new RoundColorTable();   

     }   

}   

  

class ColorTableCellRenderer extends DefaultTableCellRenderer   

{   

    DefaultTableCellRenderer renderer=new DefaultTableCellRenderer();   

    public Component getTableCellRendererComponent(JTable table, Object value,   

        boolean isSelected, boolean hasFocus, int row, int column) {   

        if(row%2 == 0){   

            //调用基类方法   

            return super.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);   

        }   

        else{   

            return renderer.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);   

        }   

    }   

    //该类继承与JLabel,Graphics用于绘制单元格,绘制红线   

    public void paintComponent(Graphics g){   

        super.paintComponent(g);   

        Graphics2D g2=(Graphics2D)g;   

        final BasicStroke stroke=new BasicStroke(2.0f);   

        g2.setColor(Color.RED);   

        g2.setStroke(stroke);   

        g2.drawLine(0,getHeight()/2,getWidth(),getHeight()/2);   

    }   

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chosen0ne/archive/2009/08/16/4453267.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息