【问题标题】:Show the Person type Object on JList (with JScrollPane) with fireIntervalAdded() method使用 fireIntervalAdded() 方法在 JList(使用 JScrollPane)上显示 Person 类型对象
【发布时间】:2019-05-22 18:28:35
【问题描述】:

节目截图

我正在开发一个读取Name,Height,Weight,Size (String,int,int,String) 并创建Person 类型对象的程序。 输入(当然不是在控制台上)应该如下所示:

Mary (h=170, w=56, size=S)
John (h=160, w=76, size XL)

在我单击添加

之后,在带有 JScrollPane 的 JList 上

我创建了一个 jButton:

JButton addPerson = new JButton("Add");

然后我添加了新的 ActionListener

addPerson.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == addPerson) {
                    int Height = sliderHeight.getValue();
                    int Weight = sliderWeight.getValue();
                    String name = nameField.getText();
                    String size = (String) sizes.getSelectedItem();

                    if (name.length() > 0) {
                        model.addPerson(Height, Weight, name, size);

//The `model` here is an Object of ListData class.
                    }else {
                        System.out.println("Enter the name.");
                    }

                }
            }
        });

这就是我的 AbstarctModel 类的样子:

private class ListData extends AbstractListModel<Person> {

        ArrayList<Person> lista = new ArrayList<Person>();

        @Override
        public int getSize() {
            return lista.size();
        }

        public void addPerson(int Height, int Weight, String name, String size) {

            lista.add(new Person(Height, Weight, name, size));
            fireIntervalAdded(this, 0, lista.size());
//I think the problem is somewhere here.
            System.out.println("Person added.");

            System.out.println("List size: " + getSize());

            for (Person p : lista) {
                System.out.println(p);
            }

        }

        @Override
        public Person getElementAt(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

    }

这工作正常,Person 对象被创建并添加到 ArrayList。

但是 它不会出现在JList 上(就在JSliders 上方)

所以,总结一下, Person 类型 Object 已创建,添加到 ArrayList 但现在在我使用 fireIntervalAdded() 方法后显示在 JList 上。

【问题讨论】:

  • 为什么只添加了一个元素,却报[0, lista.size()]的区间?除此之外,您的模型与DefaultListModel&lt;Person&gt; 相比有什么显着优势吗?进一步注意,您现在可以使用 lambda 表达式来实现 ActionLister,并且当您添加侦听器的唯一事件源是 addPerson 时,您不需要 e.getSource() == addPerson 测试。
  • 哦,如果 Person 出现在 UI 中,只要 getElementAt 返回 null,那就很奇怪了。
  • 哦,maan,这就是这个方法存在的原因!谢谢你。还有一件事,你能告诉我如何用 lambda 改变我的实现吗?我以前从未使用过它,但我知道我应该这样做。再次感谢

标签: java swing java-8


【解决方案1】:

您的ListData 实现存在两个问题。首先,您的getElementAt 返回null 而不是列表元素,因此很明显,UI 中不会出现任何列表元素。其次,事件报告的区间应该只反映受影响的元素,即添加的元素,而不是整个数据范围。

固定版本看起来像

private static class ListData extends AbstractListModel<Person> {
    private final ArrayList<Person> lista = new ArrayList<>();

    @Override
    public int getSize() {
        return lista.size();
    }

    @Override
    public Person getElementAt(int index) {
        return lista.get(index);
    }

    public void addPerson(int height, int weight, String name, String size) {
        int index = lista.size();
        lista.add(index, new Person(height, weight, name, size));
        fireIntervalAdded(this, index, index);
    }
}

请注意,与 Collection API(和大多数其他 API)不同,Swing 使用 inclusive 结束索引,因此我们必须在此处指定 [index, index]。在末尾添加多个元素时,我们必须指定 [index, lista.size()-1],而其他 API 只希望 lista.size() 作为唯一的结束索引。

进一步注意,这个模型类的功能与DefaultListModel&lt;Person&gt; 重叠,这可能更容易使用。

并且可以使用 lambda 表达式来实现ActionListeners:

JButton addPerson = new JButton("Add");
addPerson.addActionListener(event -> {
    int height = sliderHeight.getValue();
    int weight = sliderWeight.getValue();
    String name = nameField.getText();
    String size = (String) sizes.getSelectedItem();

    if (!name.isEmpty()) {
        model.addPerson(height, weight, name, size);
    }else {
        System.out.println("Enter the name.");
    }
});

e.getSource() == addPerson 测试是不必要的,因为addPerson 是这里唯一可能的事件源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-15
    • 2011-10-16
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    相关资源
    最近更新 更多