gpt4 book ai didi

java - Swing MVC - 在已经可见的情况下刷新 JComboBox 的内容

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:09 24 4
gpt4 key购买 nike

我在 Controller 类中设置组合框的模型

cboCategory.setModel(new ModernDefaultComboBoxModel(model.getProductCategories()));

productCategoriesListString . 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 的部分需要通知 View 中的组合框其模型中的数据已更改。我和JTable有同样的情况但是用JTable我可以调用fireTableRowsInserted来自其从 AbstractTableModel 实现的模型.

实际上,在AbstractListModel有一种方法fireContentsChanged但不同于 JTable ,此方法 protected ,因此我无法访问它。

我知道我可以创建一个 ModernDefaultComboBoxModel 的实例然后调用setModel组合框刷新组合框的方法,但我只是想知道是否有一种像 JTable 一样干净的“清洁”方式

最佳答案

JComboBox 实现了 ListDataListener 以监听它自己的 ComboBoxModel。对 DefaultComboBoxModel 的任何更改都应该调用 AbstractListModel 中的相关 fireXxxx() 方法,并且 JComboBox 应该看到改变。只需在 process() 中更新组合的模型。

附录:这是更新模型的最小示例。在model.addElement()上设置断点,调试,点击Add,进入方法,可以看到调用了fireIntervalAdded() ,随后更新 View 。

JFrame f = new JFrame("ComboWorkerTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(0, 1));
final JComboBox jcb = new JComboBox(new Integer[]{value});
f.add(new JButton(new AbstractAction("Add") {
@Override
public void actionPerformed(ActionEvent e) {
DefaultComboBoxModel model = (DefaultComboBoxModel) jcb.getModel();
model.addElement(++value);
}
}));
f.add(jcb);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);

关于java - Swing MVC - 在已经可见的情况下刷新 JComboBox 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15998148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com