2012-08-26 21 views
1

我正在研究用於Eclipse開發的JFace。我做了一個插件,作爲虛擬內容提供商的ComboViewer。該提供者本質上提供了硬編碼值的數據模型ArrayList。無論如何,我試圖理解這種方法。正確反映JFace觀衆數據變化的方法

我通過comboViewer.setInput(list)方法在ComboViewer上設置模型。
在按下按鈕時,我調用另一個對象的方法來更新list,我將input作爲傳遞給ComboViewer(增加了另一個元素),我調用comboViewer.refresh來反映更改,但沒有任何反應。

事實證明:

我需要調用comboViewer.setInput(list)與更新列表看到數據在我的UI組合的變化(即以前添加)。我發現comboViewer.refresh只有當我得到comboViewer作爲輸入Object通過並修改它時才反映任何更新。即如果我這樣做:

List<SomeObject> data = ((List<SomeObject>)(comboViewer.getInput())); 
data.add(new SomeObject("aaa","cccc")); 
comboViewer.refresh();  

只有這樣才能刷新數據。但我不明白什麼是使用這些API的正確方法。
我應該得到一個保留並修改我在setInput方法中傳遞的對象嗎?感覺我不應該這樣做。那麼refresh的目的是什麼?

更新提供給Viewer的數據的正確方法是什麼?

+0

這個'list'是什麼?所有更新沒有'setInput'。 –

+0

'list'是一個自定義對象的列表,其硬編碼值用作'comboViewer'的數據。不確定你的意思是'所有的更新都沒有setInput.'很好, – Cratylus

+0

好吧,我會爲你提供一些工作代碼。 –

回答

2

反映更改的正確方法是致電refresh。該list

String[] values = {"1","2","3"}; 
List<String> list = new ArrayList<String>(Arrays.asList(values)); 

創建組件

final ComboViewer comboViewer = new ComboViewer(shell, SWT.DROP_DOWN); 
comboViewer.setLabelProvider(new LabelProvider()); 
comboViewer.setContentProvider(new ArrayContentProvider()); 
comboViewer.setInput(list); 
Button button1 = new Button(shell, SWT.PUSH); 
button1.setText("Button 5"); 
button1.addSelectionListener(new SelectionListener(){ 

    @Override 
    public void widgetSelected(SelectionEvent e) { 
    // TODO Auto-generated method stub 
    System.out.println("Button 5"); 
    list.add("4"); 
    comboViewer.refresh();    
    } 

    @Override 
    public void widgetDefaultSelected(SelectionEvent e) { 
    // TODO Auto-generated method stub  
    } 

}); 

當你按下按鈕組合觀衆被更新。

+0

所以你說我們可以**用'Viewer'分享**列表?並且列表中的更新直接反映出來?所以這裏沒有併發問題? – Cratylus

+0

不是直接調用'refresh'。只要組件只讀取數據,它就可以同時使用。 –

+0

最後一個問題。我是'JFaces'的入門者。什麼是更新UI的推薦方式?像這樣或者我讀爲數據綁定的東西?我在問我應該怎麼研究下一個 – Cratylus