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

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

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

    hhh

    常用鏈接

    統計

    最新評論

    JTable 的編輯和表現

    在文檔中對JTable 解釋是:用來顯示和編輯規則的二維單元表。
        也就是說JTable的類型定義決定了它是一個規則的二維單元表,但是對于二維單元表內單元格的顯示和編輯組件的選擇又是極其靈活的.
        有如下兩個接口:
        TableCellEditor
        Component   getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column);
        
        TableCellRenderer
        Component   getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        
        所有實現這兩個接口的對象都可以配置到JTable.JTable自身定義了單元格的狀態:表現或編輯.
        
        當JTabel處于表現狀態時它會調用
        ableCellRenderer的Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)請求表現組件.
        
        當JTabel處于編輯狀態時它會調用TableCellEditor的Component   getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column);請求編輯組件.
        
        這樣我們實現TableCellEditor,TableCellRenderer這兩個接口就可以靈活的控制表格單元格的編輯和顯示.
        當然為了方便swing已經定義了這兩個接口的默認實現,如DefaultCellEditor,DefaultTableCellRenderer.


    雖然我們有了靈活控制編輯和表現的接口,但是如何控制編輯和表現狀態的轉換呢!
      首先單元格可不可以編輯由表格的模型控制。因為通常可不可以編輯取決于數據內容,所以將它定義在模型中是合理的!
      
      TableModel 接口有如下一個方法:
      boolean isCellEditable(int rowIndex, int columnIndex) ;
      JTabel會通過他來確定可不可以編輯。
      
      在可編輯的情況下,通過JTabel的 boolean editCellAt(int row, int column) ,可以啟動單元格進入編輯狀態。那么如何控制從編輯狀態退出呢?
      這個稍微復雜一點,因為從編輯狀態退出還很可能意味著要將編輯器的內容放入表格模型。
      這里有一個接口
      public interface CellEditor{
      void addCellEditorListener(CellEditorListener l)
      
       Object getCellEditorValue()
      
       void removeCellEditorListener(CellEditorListener l)
      
       void cancelCellEditing()
      
       boolean stopCellEditing()
       .................
      }
      
      TableCellEditor繼承自它,也就是說swing對單元格編輯器作了更抽象的定義。因為不僅僅是表格需要編輯。這里有個監聽器的注冊方法,看一下CellEditorListener的定義
      public interface CellEditorListener extends EventListener
      {
       void editingCanceled(ChangeEvent e)
      
       void editingStopped(ChangeEvent e)
      }
      
      很顯然編輯狀態結束的關鍵在CellEditor上。你可以主動發出事件通知CellEditorListener說結束了。也可以由外部調用
      void cancelCellEditing()
      boolean stopCellEditing()
      觸發。而CellEditorListener得到通知后通常可以調用
      Object getCellEditorValue()來獲得編輯器的值。例如JTable 就實現了CellEditorListener,當你將你的TableCellEditor設置到JTable時,JTable就會注冊上去。


     有了靈活控制編輯和表現的接口,也有了控制編輯和表現狀態的轉換機制.不過完全從這些接口開始構建一套自己的實現,也是很累的。顯然swing已經有一套比較通用的實現。
      首先看一下對于控制編輯和表現狀態的轉換,JTable有自己的一套定義,在外部事件觸發下單元格編輯和表現狀態的轉換,比如在單元格上雙擊 會使得該單元格進入編輯狀態,當編輯狀態的單元格失去焦點時,該單元格離開編輯狀態進入表現狀態。在同一時刻只有一個單元格可以進入編輯狀態等。
      
      再來看一下DefaultTableCellRenderer和DefaultCellEditor
      
      DefaultTableCellRenderer繼承JLabel實現TableCellRenderer 接口。也就是說表格通常的單元格表現都是JLabel組件。
      這個實現其實有一個巧妙之處,在實現 
      Component   getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      。。。。。。。。。。。
      return this;
      }這個方法中
      最后一句return this;表明不管單元格有多少,JLabel對象一直只有一個,只是針對不同的單元格JLabel對象的狀態不一樣,但實例只有一個,儉省很多資源。
      
      DefaultCellEditor繼承AbstractCellEditor,而AbstractCellEditor 實現了TableCellEditor。這里順便講一下,swing對很多接口的實現都有這兩個層次,對于default的都是一個可用的實現,而 Abstract多是抽象類,他只實現了接口的一部分,而這一部分通常都是很通用的。如果覺得default不能滿足要求,而覺得實現整個接口又麻煩, Abstract的就很有用。
      DefaultCellEditor有三個構造函數:
      DefaultCellEditor(JCheckBox checkBox)
      
      DefaultCellEditor(JComboBox comboBox)
      
      DefaultCellEditor(JTextField textField)
      因為編輯不像表現那么單純,通常使用編輯器的對象(如JTable)都要獲得編輯器的值,然而不同編輯器的對外接口又是非常繁多的,所以CellEditor有這樣一個方法
      Object getCellEditorValue() ;也就是說使用編輯器的對象(如JTable)不管實際編輯器有多繁雜,它就只通過Object getCellEditorValue()這個方法獲取值。那么當你要把你的編輯器用到比如JTable上,那么就要考慮如何將你的編輯器接口適配到 JTable期望的Object getCellEditorValue() 上。
      DefaultCellEditor的構造函數就是一個提供了可以將三種編輯器進行適配。其實這是一種適配器模式。也就是DefaultCellEditor可以適配三種編輯器。


    忽略了一個很重要的問題,就是如何將我們的編輯器或表現器注冊到JTable上?
      這個看是很簡單的問題,其實也并非想象當中那么簡單。
      先看一下JTable提供的明顯的注冊接口
       void setCellEditor(TableCellEditor anEditor) ;
      
       void setDefaultEditor(Class<?> columnClass, TableCellEditor editor)
      
       void setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)
      
      第一個接口很顯然整個表格單元格的編輯器將由這個注冊的編輯器接管。
      后面兩個是基于數據類型進行配置的,也就是說這種數據類型的單元格編輯器將由注冊的編輯器接管。
      那么如何決定數據類型呢?看表格模型TableModel里有一個方法
      Class<?> getColumnClass(int columnIndex);
      很明顯和是否可編輯一樣,數據類型由模型決定。
      除此之外還有另外的注冊方法,那就是表格本身也是有其他元素組成,在JTable中下一級元素是列,TableColumn。它有這兩個方法
       void setCellEditor(TableCellEditor cellEditor)
      
       void setCellRenderer(TableCellRenderer cellRenderer)
      可以將編輯器和表現器直接注冊在列上,那么這一列的編輯或表現將由你注冊的東西接管。

    posted on 2006-10-17 17:15 hhh 閱讀(3946) 評論(2)  編輯  收藏

    評論

    # re: JTable 的編輯和表現 2006-10-18 14:29 123bingbing

    增開7群,號碼 30440732
    8群 30756649
    9群 30178567
    10群 28694497

    我們的qq群:15096318 學習程序的都可以來  回復  更多評論   

    # re: JTable 的編輯和表現 2009-12-01 08:31 小曹

    說的好暈啊,看的不是很清楚啊,不是很明白啊, 可不可以加我QQ跟我說說啊
    QQ:892433568  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 又黄又大的激情视频在线观看免费视频社区在线 | 色偷偷亚洲第一综合| www.黄色免费网站| 亚洲成a人片在线网站| 免费观看美女用震蛋喷水的视频| 黄色毛片免费观看| 免费播放春色aⅴ视频| 手机永久免费的AV在线电影网| 午夜国产大片免费观看| 免费一区二区无码视频在线播放| 亚洲第一区在线观看| 本免费AV无码专区一区| 久久精品亚洲综合专区| 亚洲视频免费在线播放| 在线综合亚洲欧洲综合网站 | 四虎永久在线精品视频免费观看| 天天综合亚洲色在线精品| 亚洲国产综合精品一区在线播放| 男女一边桶一边摸一边脱视频免费| 国产V亚洲V天堂无码久久久| 最近中文字幕免费2019| 国产成人亚洲综合一区| 亚洲第一永久AV网站久久精品男人的天堂AV| 国产免费高清69式视频在线观看| 国产亚洲av片在线观看播放| 中文字幕无码播放免费| 亚洲av无码一区二区三区在线播放| 亚洲av高清在线观看一区二区| 中文字幕不卡免费视频| 亚洲特级aaaaaa毛片| 国产gav成人免费播放视频| 女同免费毛片在线播放| 亚洲av无码专区在线| 亚洲精品视频免费| 最近中文字幕完整免费视频ww| 亚洲国产精品网站在线播放| 亚洲色偷偷偷鲁综合| 成人免费毛片观看| a级毛片无码免费真人久久| 77777亚洲午夜久久多喷| 亚洲乱码国产一区网址|