Показать объект типа Person в JList (с JScrollPane) с помощью метода fireIntervalAdded () - PullRequest
1 голос
/ 22 мая 2019

Снимок экрана программы A

Я работаю над программой, которая читает Name,Height,Weight,Size (String,int,int,String) и создает объект типа Person.Ввод (не на консоли конечно) должен выглядеть следующим образом:

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

в JList с JScrollPane сразу после нажатия Добавить

Я создал 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)

Итак, суммируя его,Тип персонажа Объект создан, добавлен в ArrayList НО теперь отображается на JList после того, как я использую fireIntervalAdded() метод.

1 Ответ

2 голосов
/ 24 мая 2019

Есть две проблемы с вашей реализацией ListData.Прежде всего, ваш getElementAt возвращает null, а не элемент списка, поэтому, очевидно, ни один элемент списка не может отображаться в пользовательском интерфейсе.Во-вторых, интервалы, сообщаемые событием, должны отражать только затронутые элементы, то есть добавленные элементы, а не весь диапазон данных.

Фиксированная версия будет выглядеть как

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

Обратите внимание, что в отличие отAPI коллекции (и большинство других API) Swing использует конечный индекс включительно , поэтому здесь нужно указать [index, index].При добавлении нескольких элементов в конце мы должны указать [index, lista.size()-1], тогда как другие API ожидают только lista.size() в качестве исключительного индекса конца.

Обратите внимание, что функциональность этого класса модели перекрывается сDefaultListModel<Person>, который может быть проще в использовании.

И вы можете использовать лямбда-выражения для реализации ActionListener s:

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здесь единственный возможный источник событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...