<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了吧

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


    網站導航:
     
    主站蜘蛛池模板: 一级毛片免费播放试看60分钟| 无码一区二区三区亚洲人妻| 99久久精品毛片免费播放| 亚洲∧v久久久无码精品| CAOPORN国产精品免费视频| 亚洲精品无码成人片在线观看| 无套内射无矿码免费看黄| 亚洲成a人在线看天堂无码| 免费福利在线观看| 亚洲成人国产精品| 中文在线免费观看| 久久亚洲AV午夜福利精品一区| 污视频在线观看免费| 亚洲成a人片7777| 大学生一级特黄的免费大片视频 | 久久久久亚洲精品影视| 最近中文字幕大全免费版在线| 亚洲AV无码久久精品色欲| 国产黄色免费网站| 在线观看日本亚洲一区| 国产人成免费视频| 女人隐私秘视频黄www免费| 亚洲国产天堂在线观看| 在线看片v免费观看视频777| 亚洲欧洲免费无码| 久久亚洲精品无码观看不卡| 人人玩人人添人人澡免费| 亚洲日产2021三区在线| 免费的一级片网站| 国产免费久久精品99久久| 一区二区三区亚洲| 精品久久洲久久久久护士免费| 一级日本高清视频免费观看| 国产亚洲综合网曝门系列| 4hu四虎最新免费地址| 麻豆69堂免费视频| 久久亚洲AV无码精品色午夜| 日韩毛片无码永久免费看| 好湿好大好紧好爽免费视频| 亚洲国产精品成人综合久久久| 免费一看一级毛片全播放|