<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1439) 評論(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了吧

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


    網站導航:
     
    主站蜘蛛池模板: 久久亚洲国产中v天仙www| 97久久精品亚洲中文字幕无码| 成人免费网站久久久| 亚洲av中文无码乱人伦在线r▽| 国内精自视频品线六区免费| 美女裸免费观看网站| 亚洲av无码一区二区三区网站| AA免费观看的1000部电影| 国产精品青草视频免费播放| 亚洲精品国产专区91在线| 国产免费av一区二区三区| 亚欧免费无码aⅴ在线观看| 亚洲精品国产精品| 亚洲av中文无码乱人伦在线r▽| 女人毛片a级大学毛片免费| 日韩免费的视频在线观看香蕉| 亚洲人成欧美中文字幕| 亚洲AV永久精品爱情岛论坛| 日本一区免费电影| 蜜桃成人无码区免费视频网站| 精品免费AV一区二区三区| 亚洲视频免费在线播放| 国产亚洲精品免费视频播放| 四虎免费大片aⅴ入口| 无码国产精品一区二区免费vr| 三年片在线观看免费观看大全中国| 亚洲视频网站在线观看| 国产亚洲精品免费视频播放| 日本免费网站在线观看| 亚洲免费在线视频播放| 日韩免费高清播放器| 免费看黄网站在线看 | 四虎永久免费地址在线观看| 91av免费观看| a级毛片100部免费观看| 特级aaaaaaaaa毛片免费视频| 学生妹亚洲一区二区| 亚洲免费人成视频观看| 亚洲精品天天影视综合网| 亚洲综合亚洲综合网成人| 日韩一区二区免费视频|