您好我有以下设置。
这是我拥有的6个班级。在BankApp内部,我有一个存储所有人物对象的arraylist。
BankAccView和PersonView都有一个JComboBox,所以我可以选择一个“Person”对象,例如给他或她一个bankAccount号码。
我遇到的问题是JComboBox没有自动重载。它看起来如下
in my constructor I have this
personenList = new JComboBox();
personenList.addItemListener(new ItemChangeListener(this));
在我的ActionListener例如这个(但我认为它不好)所以当创建一个新人时,JComboBox应该每次都自动刷新。 (这是什么不起作用)
personenList.addItem(persoon);
我认为这也很重要。 itemchangelistener是这样的。
public class ItemChangeListener implements ItemListener {
Persoon selectedPerson;
RekeningApp app;
PersoonView view;
public ItemChangeListener(PersoonView view) {
this.view = view;
}
public void itemStateChanged(ItemEvent event) {
if (event.getStateChange() == ItemEvent.SELECTED) {
Object item = event.getItem();
// do something with object
if(item instanceof Persoon) {
this.selectedPerson = (Persoon) item;
view.setOverzicht(this.selectedPerson);
} else {
this.selectedPerson = null;
}
}
}
}
答案 0 :(得分:2)
窗口关闭后,您需要以某种方式维护状态。这可以通过多种方式完成:
当窗口关闭时,实际上不要关闭它,只需隐藏它。请参阅JFrame.setDefaultCloseOperation这可能是最简单的解决方案,但它并不健全,因为从应用程序的其余部分访问存储的人员并不容易。
将数据存储在外部数据结构中,然后在重新创建数据时将数据传递到视图中。这可能是最好的解决方案,因为它允许您对数据执行其他操作,例如在下次运行程序时将其写入文件或数据库。
创建自己的ComboBoxModel
实现,该实现由#2的外部数据结构支持。这可能是最好的解决方案,因为您不必每次都手动加载数据(它只需要您的一个数组列表等),但对您的情况可能有点过分。我建议将其用于生产应用程序而不是作业。
以下是您可能用于3的一些代码:
public class PersonComboBoxModel extends AbstractListModel<Person> implements MutableComboBoxModel<Person> {
private List<Person> comboData;
public PersonComboBoxModel(List<Person> initialPeople) {
comboData = new ArrayList<Person>(initialPeople);
}
// Implement the interface methods.
// Make sure to call the fireXXXchanged methods from AbstractListModel at the appropriate times.
}
你可以将它用于#2:
public PersonView(List<Person> initialPeople) {
personenList = new JComboBox();
for(Person p : initialPeople) {
personenList.addItem(p);
}
personenList.addItemListener(new ItemChangeListener(this));
// etc.
}