TWaver - 专注UI技术

http://twaver.servasoft.com/
posts - 171, comments - 191, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Renderer&Editor之Swing篇(二)

Posted on 2010-08-24 11:52 TWaver 阅读(1077) 评论(0)  编辑  收藏
上篇的例子主要的动作在editor上,不过editor只有在点击在cell单元的时候才会显示,所以还不得不造一个界面跟editor一样的renderer进行“造假”,当然由于这个例子只有两个按钮,所以renderer的代码不多,不过如果editor的组件很多,而且经常需要改动那不就麻烦了,所以我们可以考虑一下让renderer复用editor的显示部分,以下的代码就是很好的说明了这种复用
  1import java.awt.*;
  2import java.awt.event.*;
  3import javax.swing.*;
  4import javax.swing.table.*;
  5
  6public class TableTest2 extends JFrame {
  7 JTable table;
  8 String[] states = new String[]{"stop""stop""stop"};
  9
 10 // model
 11 class TableModel extends AbstractTableModel{
 12  public int getColumnCount() {
 13   return 2;
 14  }

 15  public int getRowCount() {
 16   return states.length;
 17  }

 18  public Object getValueAt(int rowIndex, int columnIndex) {
 19   if(columnIndex == 0){
 20    return states[rowIndex];
 21   }

 22   return null;
 23  }

 24     public String getColumnName(int columnIndex) {
 25   if(columnIndex == 0){
 26    return "state";
 27   }
else{
 28    return "operate";
 29   }

 30     }

 31     public boolean isCellEditable(int rowIndex, int columnIndex) {
 32   if(columnIndex == 0){
 33    return false;
 34   }
else{
 35    return true;
 36   }

 37     }

 38 }

 39
 40 // cell editor
 41 class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
 42  int row;
 43  JTable table;
 44  JPanel panel;
 45  JButton start;
 46  JButton stop;
 47  Editor(){
 48   panel = new JPanel();
 49   panel.setLayout(new GridLayout(12));
 50   start = new JButton("start");
 51   stop = new JButton("stop");
 52   start.addActionListener(this);
 53   stop.addActionListener(this);
 54   panel.add(start);
 55   panel.add(stop);
 56  }

 57     public Object getCellEditorValue() {
 58         return null;
 59     }

 60     public Component getTableCellEditorComponent(
 61       JTable table, Object value, boolean isSelected, int row, int column) {
 62      this.table = table;
 63      this.row = row;
 64      return panel;
 65     }

 66
 67  public void actionPerformed(ActionEvent e) {
 68   if(e.getSource() == start){
 69    states[row] = "start";
 70   }
else{
 71    states[row] = "stop";
 72   }

 73   ((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
 74  }

 75
 76 }

 77
 78 // cell render
 79 class Renderer extends JComponent implements TableCellRenderer{
 80  TableCellEditor editor;
 81  Renderer(TableCellEditor editor){
 82   this.editor = editor;
 83  }

 84  public Component getTableCellRendererComponent(JTable table, Object value,
 85    boolean isSelected, boolean hasFocus, int row, int column) {
 86   return editor.getTableCellEditorComponent(table, value, isSelected, row, column);
 87  }

 88 }

 89
 90 public TableTest2(){
 91  super("editor used by renderer");
 92  table = new JTable(new TableModel());
 93  TableColumn tableColumn = table.getColumnModel().getColumn(1);
 94  tableColumn.setCellRenderer(new Renderer(new Editor()));
 95  tableColumn.setCellEditor(new Editor());
 96
 97        this.getContentPane().setLayout(new BorderLayout());
 98        this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
 99        this.setSize(500300);
100        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
101 }

102 public static void main(String[] args) {
103  new TableTest2().show();
104 }

105}


只有注册用户登录后才能发表评论。


网站导航: