【问题标题】:Auto refresh jcombobox自动刷新 jcombobox
【发布时间】:2013-10-21 19:45:38
【问题描述】:

您好,我有以下设置。

这是我的 6 节课。在 BankApp 中,我有一个存储所有人员对象的数组列表。

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;
                }
            }
        }

    }

【问题讨论】:

    标签: java swing oop jcombobox comboboxmodel


    【解决方案1】:

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

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

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

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

    这里有一些你可能会用到的代码:

    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.
    }
    

    【讨论】:

    • 问题实际上是......如果我关闭人员视图或 BankAccView 并重新打开它们,我希望所有对象都回到 JComboBox 中。
    • @Reshad 更新了,我知道问题出在哪里了
    • 我必须使用你在我的开始帖子中看到的那些类的实现。数据存储在 bankApp 的数组列表中,并且始终在运行
    • @Reshad 所以使用选项 2,并在视图重新打开时将数据传递到 ComboBox。
    • 我的 itemchangelistener 怎么知道在哪里显示人名、银行卡号等?请参阅我的开始帖子,因为现在它只对 personview 有好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多