自动刷新jcombobox

时间:2013-10-21 19:45:39

标签: java swing oop jcombobox comboboxmodel

您好我有以下设置。

enter image description here

这是我拥有的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;
                }
            }
        }

    }

1 个答案:

答案 0 :(得分:2)

窗口关闭后,您需要以某种方式维护状态。这可以通过多种方式完成:

  1. 当窗口关闭时,实际上不要关闭它,只需隐藏它。请参阅JFrame.setDefaultCloseOperation这可能是最简单的解决方案,但它并不健全,因为从应用程序的其余部分访问存储的人员并不容易。

  2. 将数据存储在外部数据结构中,然后在重新创建数据时将数据传递到视图中。这可能是最好的解决方案,因为它允许您对数据执行其他操作,例如在下次运行程序时将其写入文件或数据库。

  3. 创建自己的ComboBoxModel实现,该实现由#2的外部数据结构支持。这可能是最好的解决方案,因为您不必每次都手动加载数据(它只需要您的一个数组列表等),但对您的情况可能有点过分。我建议将其用于生产应用程序而不是作业。

  4. 以下是您可能用于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.
    }