2013-07-11 20 views
5

Eclipse RCP uygulamasında veritabanını anlamada sorun yaşıyorum. Sadece Eclipse RCP uygulamasında bir listeyi ciltleme için en iyi yöntem

İşte

Ben metinler listesi görüntülenmesi gereken bir görünümü var yapmak istediğim bu .. işe gerekiyordu anlamaya olamaz. Metinler, bir tekil yoluyla sağlanan basit bir List<String>'da "saklanır" (yalnızca gösterim amacıyla;)). Yani ListProvider'u kullanan kişi metinlerin listesini alacak. Liste değiştiğinde, Görünümümün tablo içeriğini otomatik olarak güncellemesini istiyorum.

Ben bugüne kadar

My Liste sağlayıcısına yapıldığında liste değişiklikleri gözlemci bilgilendirecek bir Observable olduğunu buydu.

Görüşüme göre, liste sağlayıcısını izlemek için bir Gözlemci oluyorum ve gözlemciye bildirildiğinde görünümümü yenile.

Kod ListProvider için: görünüm için

public class ListProvider extends Observable { 

    private Stack<String> hist; 
    private static ListProvider instance; 

    // Singleton implementation 
    public static ListProvidergetInstance() { 
     if (null == instance) { 
      instance = new ListProvider 
     } 
     return instance; 
    } 

    public void add(String text) { 
     if (this.hist.size() == MAX_SIZE) { 
      this.hist.remove(MAX_SIZE-1); 
     } 
     this.hist.add(0, text); 
     // notify all observers 
     this.setChanged(); 
     this.notifyObservers(); 
    } 
} 

Kodu:

public class TestView extends ViewPart { 

private TableViewer viewer; 

[...] 

class ViewContentProvider implements IStructuredContentProvider { 
    public void inputChanged(Viewer v, Object oldInput, Object newInput) { 
    } 
    public void dispose() { 
    } 
    public Object[] getElements(Object parent) { 
     return ClipboardHistory.getInstance().getList().toArray(); 
    } 
} 

public void createPartControl(Composite parent) { 
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
    IContentProvider contentProvider = new ViewContentProvider(); 
    viewer.setContentProvider(contentProvider); 
    viewer.setLabelProvider(new ViewLabelProvider()); 
    viewer.setInput(getViewSite()); 

    Observer listObserver = new Observer() { 
     @Override 
     public void update(Observable o, Object arg) { 
      // update the table viewer 
      viewer.refresh(); 
     } 
    }; 

    ListProvider.getInstance().addObserver(listObserver); 
} 
} 

Soru

gitmek yoksa ben üzere Observer ve Observable "doğru" yolu kullanıyor bir şey mi eksik? RCP Databinding kavramını kavradığımdan emin değilim ...

+0

Listenizdeki öğelerin kapsamından emin değilim, ancak basit bir SWT Listesi eklemeyi düşündünüz mü (http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.platform .doc.isv% 2Freference% 2Fapi% 2Forg% 2Feclipse% 2Fswt% 2Fwidgets% 2FList.tableviewer vb. yerine görünümünüze html) nesnesi – nbz

+0

Ayrıca bir ListViewer kullanmak daha iyi olabilir (http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc. isv% 2Freference% 2Fapi% 2Forg% 2Feclipse% 2Fjface% 2Fviewers% 2FListViewer.html) bir TableViewer yerine. – nbz

+0

Giriş için teşekkürler. Şu anda sadece bir liste ama daha sonra diğer sütunlara daha fazla veri eklemek istiyorum. ListViewer kullanmak, listeyi gözlemlememi değiştirir mi? – Friederike

cevap

5

İşi kolaylaştırmak için BeanProperties.

Ayrıca bağlayıcı ViewerSupport yardımıyla sonunda yapılır referans için bir çalışma örneği JFace Databinding Snippet: Model to TableViewer binding görebilirsiniz: o yardımcıları ile

(...) 
TableViewer peopleViewer = new TableViewer(committers); 
ViewerSupport.bind(peopleViewer, new WritableList(viewModel.getPeople(), 
    Person.class), BeanProperties.value(Person.class, "name")); 

için Observer uygulamak gerekir kalmayacaktır.NEWLINENEWLINEKonum Listesini değiştirdiyseniz ve görüntüleyicinin veriyi değiştirdiğinde etiketlerini güncellemesini istiyorsanız, aynı örnekte PropertyChangeSupport'a bir göz atın; bu, görüntüleyiciyi, bildirdiğiniz listenin herhangi bir öğesindeki her değişiklikte yenileyebilmenizi sağlar. Ciltleme için BeanProperties kullanmanız önemlidir.

+0

Bu iyi bir çözüm gibi görünüyor. Fakat bunu kullanarak bir tablo görüntüleyici ile doğrulayıcıları ve dönüştürücüleri kullanmanın bir yolu var mı? – Lii

1

Bir olası istisna ile yaklaşımınızda yanlış bir şey olduğunu düşünmüyorum. Sen izleyici UI iş parçacığı yenilenir emin olmak gerekir:

Display.getDefault().asyncExec(new Runnable() { 
    @Override 
    public void run() { 
     viewer.refresh(); 
    } 
}); 

Ancak tablo güncelleme daha verimli kılmak için yapabileceğiniz şeyler vardır. Kodunuzda sadece tablonun en üstünde tek bir öğe eklemek için görünür, bu yüzden bir çağrı ile daha iyi olurdu yukarıda: Sana JFace Databinding okuma ve ViewerSupport, ObservableListContentProvider faydalanmak ve tavsiye

viewer.insert(text, 0); 
+0

UI iş parçacığı üzerindeki not için teşekkürler. Viewer.insert ile yapılan optimizasyona gelince, daha verimli olduğunu düşünmüyorum. Modelimde hangi değişikliklerin yapıldığından emin olamıyorum. Bu yüzden güncellemeleri/ekler/silme işlemlerini kontrol etmek zorundayım. Bütün listeyi tekrar almaktan ve görüntülemekten daha pahalı. ;) – Friederike

İlgili konular