設置我的組合框的模式在我的控制器類搖擺MVC - 刷新JComboBox中的內容,而已經可見
cboCategory.setModel(new ModernDefaultComboBoxModel(model.getProductCategories()));
productCategories
是String
一個List
。 ModernDefaultComboBoxModel
只是延伸DefaultComboBoxModel
的型號。
public class ModernDefaultComboBoxModel extends DefaultComboBoxModel{
public ModernDefaultComboBoxModel(List<String> elements){
super(elements.toArray());
}
}
現在在我的模型,productCategories
從DB填充,在SwingWorker
SwingWorker<Void, String> worker = new SwingWorker<Void, String>() {
@Override
protected Void doInBackground() throws Exception {
//query and resultset stuff
while (rs.next()) {
publish(rs.getString(1));
}
//cleanup stuff
}
@Override protected void process(List<String> chunks){
List<String> oldCategories = new ArrayList<String>(productCategories);
for(String cat : chunks){
productCategories.add(cat);
}
fireModelPropertyChange(PRODUCT_CATEGORIES, oldCategories, productCategories);
}
@Override
protected void done(){
//some stuff
}
};
worker.execute();
你看每一個publish
,它觸發一個屬性更改事件,以它的監聽器(fireModelPropertyChange
僅僅是一個包裝firePropertyChange
)。
現在,
@Override
public void propertyChange(PropertyChangeEvent evt) {
String propName = evt.getPropertyName();
//some branching for the other models
else if(ProductModel.PRODUCT_CATEGORIES.equals(propName)){
List<String> newVal = (List<String>)evt.getNewValue();
//notify the model of the combobox that the data is changed, so refresh urself
}
//some stuff
}
我被困在我的ModelListener
需要通知的組合框的觀點,即在其模型中數據被更改的部分。我有與JTable
相同的情況,但JTable
我可以從AbstractTableModel
實施的模型中調用fireTableRowsInserted
。
實際上,在AbstractListModel
中有一個方法fireContentsChanged
,但與JTable
不同,此方法受保護,因此我無法訪問它。
我知道我可以只創建的ModernDefaultComboBoxModel
一個實例然後調用組合框的setModel
方法刷新組合框,但我只是想知道是否有作爲的JTable
永永遠改變模型的基礎數據結構在腳下(和_永遠_調用它的任何fireXX方法形成外部的代碼,這是模型本身所固有的責任) - 相反,使用模型API來添加新項目 – kleopatra
好的。那麼JTable的情況也是如此?沒有權利,因爲我們無法將數據添加到JTable(例如JComboBox的addItem) – Bnrdo
@kleopatra是正確的;看起來您正在計劃將您的'ModernDefaultComboBoxModel'註冊爲應用程序數據模型的偵聽器並正確更新組合框模型;組合視圖將隨後顯示。 – trashgod