首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

TableCellRenderer & TableCellEditor 差别(转载)

2012-11-10 
TableCellRenderer & TableCellEditor 区别(转载)TableCellRenderer就是用来绘制展示当前cell单元数值内容

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(); }}

?

热点排行