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

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

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

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

    好在SWT中可以嵌入AWT。

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

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

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

     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 閱讀(705) 評(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)民]
    后來(lái)發(fā)現(xiàn),這完全是沒(méi)有必要的!呵呵,不過(guò)搞清楚了一些數(shù)據(jù)綁定和UI線程的關(guān)系。  回復(fù)  更多評(píng)論
      

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


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

    <2013年3月>
    242526272812
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    常用鏈接

    留言簿

    隨筆分類(lèi)

    隨筆檔案

    相冊(cè)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 精品一区二区三区无码免费视频| 亚洲中文字幕无码中文字在线| 国产99视频精品免费专区| 看一级毛片免费观看视频| 亚洲精品亚洲人成在线麻豆| 在线精品亚洲一区二区小说| 国产性生交xxxxx免费| 国产精品1024永久免费视频| 免费国产成人18在线观看| 一级毛片aaaaaa视频免费看| 国产AV无码专区亚洲AV蜜芽 | 老司机午夜在线视频免费观| 亚洲人成网站日本片| 亚洲AV成人精品网站在线播放| 亚洲一区日韩高清中文字幕亚洲| 国产不卡免费视频| 成人看的午夜免费毛片| 亚洲高清中文字幕免费| 13一14周岁毛片免费| 麻豆成人久久精品二区三区免费| a级毛片黄免费a级毛片| 成人av片无码免费天天看| 国产免费区在线观看十分钟 | 国产免费啪嗒啪嗒视频看看| 国产成人A在线观看视频免费| 国色精品卡一卡2卡3卡4卡免费| 中文字幕免费视频一| 9420免费高清在线视频| 先锋影音资源片午夜在线观看视频免费播放| 久久久久一级精品亚洲国产成人综合AV区 | 99免费精品视频| 中文字幕无线码中文字幕免费| 亚洲精品偷拍视频免费观看| 七次郎成人免费线路视频| 九九免费久久这里有精品23| 一区二区3区免费视频| 精品乱子伦一区二区三区高清免费播放| 成人在线免费视频| 一级全免费视频播放| 巨胸喷奶水www永久免费 | 国产亚洲精品a在线无码|