West Farm
          吾本布衣,生于川北,躬耕于代碼的田地上。
          posts - 16,  comments - 15,  trackbacks - 0
          SWT的Table不夠強(qiáng)大,而且似乎有嚴(yán)重的性能問題。(貌似是調(diào)用OS的實(shí)現(xiàn),但是在win7上面跑卻非常慢,奇特!本地的性能不如虛擬機(jī)上跑的Swing)

          好在SWT中可以嵌入AWT。

          反正本人以前沒有過多Swing的經(jīng)驗(yàn),但是在試玩了JTable之后發(fā)現(xiàn)確實(shí)很強(qiáng)大。

          對(duì)于有興趣的讀者可以試一下,本文將分享如何使得JTable與JFace Data Binding Framework(下文中簡(jiǎn)稱JDBF)一起協(xié)同工作。

          通常像Table和List這種UI組件,展現(xiàn)的都是一個(gè)對(duì)象集合。JDBF 則為我們處理對(duì)象集合和UI界面的同步的問題。以List為例子,在Java中有java.util.List,而JFDB則提供了相應(yīng)的
          ObservableList類,這個(gè)類Wrap一個(gè)java.util.List,當(dāng)你對(duì)其進(jìn)行增刪改時(shí),與其綁定的UI組件會(huì)自動(dòng)得到同步。但是ObservableList 的實(shí)現(xiàn)有個(gè)很大的問題就是對(duì)其的訪問只限于其所屬的Realm,這個(gè)Realm說白了就是SWT的UI線程,而當(dāng)我們?cè)赟WT中嵌入AWT時(shí),其中的AWT界面是跑在其自身的線程里面的。所以想要讓JTable與JFace Data Binding Framework(下文中簡(jiǎn)稱JDBF)一起協(xié)同工作還要解決多線程的問題。廢話不多說了,直接上菜:

           public class DOTableModel extends AbstractTableModel  {
              /**
               * the ObservableList instance  to be shared with
               
          */
              private ObservableList list;
              
              private volatile  Integer  rowCount = null;
              
              private volatile DOModel object;;
              
              private  final Object lock = new Object();

              private static final long serialVersionUID = -8377145381412656796L;
              
              public DOTableModel(ObservableList list){
                  this.list = list;
                  this.list.addListChangeListener(new IListChangeListener(){
                      @Override
                      public void handleListChange(ListChangeEvent event) {
                          for(ListDiffEntry de : event.diff.getDifferences()){
                              if(de.isAddition()){
                                  DOTableModel.this.fireTableRowsInserted(de.getPosition(), de.getPosition());
                              }else{
                                  DOTableModel.this.fireTableRowsDeleted(de.getPosition(), de.getPosition());
                              }
                          }
                      }
                  });
              }

              @Override
              public int getRowCount() {
                  list.getRealm().exec(new Runnable(){
                      @Override
                      public  void run() {
                          rowCount = list.size();
                          synchronized (lock) {
                              lock.notify();
                           }
                      }
                  });
                  synchronized (lock) {
                      while(rowCount == null){
                          try {
                              lock.wait();
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                      }
                   }
                  return rowCount;
              }

              @Override
              public int getColumnCount() {
                  return 11;
              }
              
              private void getObjectFromSWTRealm(final int rowIndex){
                  object =  null;
                  list.getRealm().exec(new Runnable(){
                      @Override
                      public synchronized void run() {
                          object = (DOModel) list.get(rowIndex);
                          synchronized (lock) {
                              lock.notify();
                           }
                      }
                  });
                  synchronized (lock) {
                      while(object == null){
                          try {
                              lock.wait();
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                      }
                   }
              }

              @Override
              public Object getValueAt(final int rowIndex, int columnIndex) {
                  getObjectFromSWTRealm(rowIndex);
                  ...
              }

              @Override
              public void setValueAt(Object oValue, final int rowIndex, int columnIndex) {
                  getObjectFromSWTRealm(rowIndex); 
                  ...
              }

              @Override
              public String getColumnName(int column) {
                 ...
              }

              @Override
              public boolean isCellEditable(int rowIndex, int columnIndex) {
                  return true;
              }
              
              

          }





          posted on 2012-04-05 23:46 West Farmer 閱讀(701) 評(píng)論(2)  編輯  收藏

          FeedBack:
          # re: 讓JFace Data Binding與Swing JTable一起舞蹈
          2012-04-05 23:49 | [西部農(nóng)民]
          本人一貫不提供任何成熟的可立即投入使用的代碼。  回復(fù)  更多評(píng)論
            
          # re: 讓JFace Data Binding與Swing JTable一起舞蹈
          2013-03-14 00:17 | [西部農(nóng)民]
          后來發(fā)現(xiàn),這完全是沒有必要的!呵呵,不過搞清楚了一些數(shù)據(jù)綁定和UI線程的關(guān)系。  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          相冊(cè)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 神木县| 淮北市| 新沂市| 台湾省| 绥化市| 德令哈市| 安康市| 贵南县| 鹤庆县| 汉源县| 成武县| 鹿泉市| 海淀区| 大悟县| 榆树市| 合川市| 焉耆| 丰原市| 康定县| 股票| 柘城县| 共和县| 遵化市| 赣州市| 扶沟县| 镇原县| 中卫市| 盘山县| 公主岭市| 崇义县| 建始县| 高安市| 舞阳县| 旌德县| 武陟县| 平陆县| 碌曲县| 江永县| 阿拉善左旗| 双鸭山市| 定兴县|