TWaver - 專注UI技術

          http://twaver.servasoft.com/
          posts - 171, comments - 191, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Renderer&Editor之Swing篇(一)

          Posted on 2010-08-24 11:39 TWaver 閱讀(1442) 評論(2)  編輯  收藏

          renderer和editor的機制的掌握對于能否靈活深入使用Swing、Flex、Silverlight包括Web組件尤為重要,但renderer和editor的機制對于初學者而已的確有一定的門檻,甚至可以說有相當的UI開發者縱使簡歷上赫然寫著具備N年UI開發經驗,當你面試問及renderer和editor原理是很多人是一頭霧水,更有甚者會反過來問你啥叫“renderer”?啥叫“editor”?即使聽過的大部分也是一知半解,他會敷衍的回答:“不就是表格上的那個什么什么..”,更別提現場讓他寫個哪怕是bool的check類型的renderer和edtior。

          如果作為interviewer哪天你有幸遇到一位能和你深入討論如何讓tree、combobox、list和table的renderer進行代碼復用,如何讓renderer對象實例進行復用以及復用需要注意的副作用時,我強烈建議你趕緊留著此人,這種人已是稀有物種了。

          言歸正傳,以下通過Swing的表格為例通過幾個例子幫助大家理解:
          TableCellRenderer就是用來繪制展示當前cell單元數值內容的,你可以用文字、數值或者圖片來表示內容,當然最強大展示方式的就是通過自定義自己的renderer組件,通過Java2D來繪制各種天花亂墜的效果。
          TableCellEditor主要是用來當用戶點擊在具體cell時進行編輯的組件,所以TableCellEditor除了具有TableCellRenderer一樣的繪制功能外還可以進行交互動作,例如在cell上出現下拉框、勾選框甚至通過按鈕彈出更復雜的對話框讓用戶進行輸入編輯。

          以下是在cell中嵌入start、stop兩個按鈕的表格,注意這里的renderer只是用來顯示效果,并沒有進行交互動作,真正進行動作的是當你將鼠標點擊在cell上時,JTable定位上去的editor,所以不要徒勞在renderer上做點擊事項處理,renderer是不會接受到交互事項的,renderer只是個畫筆,你看到的start、stop按鈕只是這個畫筆畫出來的內容,是虛的并沒有真正的組件在上面。

            1import java.awt.*;
            2import java.awt.event.*;
            3import javax.swing.*;
            4import javax.swing.table.*;
            5public class TableTest1 extends JFrame {
            6 JTable table;
            7 String[] states = new String[]{"stop""stop""stop"};
            8
            9 // model
           10 class TableModel extends AbstractTableModel{
           11  public int getColumnCount() {
           12   return 2;
           13  }

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

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

           21   return null;
           22  }

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

           29     }

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

           36     }

           37 }

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

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

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

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

           75   ((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
           76  }

           77
           78 }

           79
           80 // cell render
           81 class Renderer extends JComponent implements TableCellRenderer{
           82  JPanel panel;
           83  JButton start;
           84  JButton stop;
           85  Renderer(){
           86   panel = new JPanel();
           87   panel.setLayout(new GridLayout(12));
           88   start = new JButton("start");
           89   stop = new JButton("stop");
           90   panel.add(start);
           91   panel.add(stop);
           92  }

           93  public Component getTableCellRendererComponent(JTable table, Object value,
           94    boolean isSelected, boolean hasFocus, int row, int column) {
           95   return panel;
           96  }

           97 }

           98
           99 public TableTest1(){
          100  super("renderer and editor self-existent");
          101  table = new JTable(new TableModel());
          102  TableColumn tableColumn = table.getColumnModel().getColumn(1);
          103  tableColumn.setCellRenderer(new Renderer());
          104  tableColumn.setCellEditor(new Editor());
          105
          106        this.getContentPane().setLayout(new BorderLayout());
          107        this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
          108        this.setSize(500300);
          109        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          110 }

          111 public static void main(String[] args) {
          112  new TableTest1().show();
          113 }

          114}


          評論

          # re: Renderer&Editor之Swing篇(一)  回復  更多評論   

          2010-08-24 12:05 by 日月雨林@gmail.com
          大哥,能不能給個JDK1.6 的截圖啊,感覺1.5 很丑。

          # re: Renderer&Editor之Swing篇(一)  回復  更多評論   

          2010-08-24 13:21 by yahuu
          是JDK1.4是比較丑,估計樓主是早些年寫的文章,現在應該沒有什么人再用JDK1.4了吧

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


          網站導航:
           
          主站蜘蛛池模板: 平乐县| 富顺县| 榆中县| 拜泉县| 文成县| 固原市| 海阳市| 任丘市| 綦江县| 高台县| 泸溪县| 同仁县| 万全县| 屏边| 时尚| 城固县| 六枝特区| 梁河县| 五华县| 伊川县| 廉江市| 临邑县| 肇源县| 彰化县| 赫章县| 焦作市| 乌兰察布市| 庆阳市| 怀远县| 蒙自县| 启东市| 凯里市| 峨山| 辽源市| 天祝| 沙河市| 闵行区| 泰和县| 渑池县| 平果县| 丰都县|