隨筆 - 6  文章 - 1  trackbacks - 0
          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           簡單來說:

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

          posted on 2008-07-25 23:56 川流不息 閱讀(1785) 評論(1)  編輯  收藏

          FeedBack:
          # re: TableCellRenderer & TableCellEditor 區別(轉載)[未登錄] 2009-03-05 17:22 Roger
          You are very good.  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 甘德县| 周至县| 喀喇沁旗| 勐海县| 丰原市| 宝鸡市| 桓台县| 榆社县| 韩城市| 公主岭市| 通山县| 略阳县| 博湖县| 左云县| 尤溪县| 北海市| 定安县| 拉萨市| 云林县| 健康| 杂多县| 寿阳县| 墨竹工卡县| 阿巴嘎旗| 三河市| 晴隆县| 醴陵市| 丰镇市| 纳雍县| 集安市| 筠连县| 绥棱县| 甘肃省| 大余县| 德令哈市| 陈巴尔虎旗| 剑阁县| 曲沃县| 芦溪县| 镇康县| 拉孜县|