我在控制器类中设置了组合框的模型
cboCategory.setModel(new ModernDefaultComboBoxModel(model.getProductCategories()));
productCategories
是一个List
。只是扩展的模型。String
ModernDefaultComboBoxModel
DefaultComboBoxModel
public class ModernDefaultComboBoxModel extends DefaultComboBoxModel{
public ModernDefaultComboBoxModel(List<String> elements){
super(elements.toArray());
}
}
现在在我的模型中,productCategories
从数据库中填充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
我可以fireTableRowsInserted
从它实现的模型中调用AbstractTableModel
。
实际上,在 中AbstractListModel
有一种方法fireContentsChanged
,但与 中不同JTable
,此方法受到保护,因此我无法访问它。
我知道我可以创建一个实例,ModernDefaultComboBoxModel
然后调用setModel
组合框的方法来刷新组合框,但我只是想知道是否有一种像JTable