Пользовательские классы и JLists

#java #model-view-controller #netbeans #arraylist #jlist

#java #модель-представление-контроллер #netbeans #arraylist #jlist

Вопрос:

Я работаю в NetBeans над проектом Java.

Мне нужно отобразить каждый State (например, «Оклахома») в ArrayList<State> в JList .

Я не могу понять, как это сделать … особенно не в NetBeans.

Я думаю, что это включает в себя создание DefaultListModel с каждым State в качестве String . Я пробовал это миллион разных способов, но безрезультатно.

Возможно ли просто загрузить ArrayList<State> (возможно, если у State класса есть toString() метод)? Это было бы особенно полезно, потому что я мог бы напрямую изменять ArrayList<State> via actionPerformed() .

Ради ответа на вопрос, давайте предположим, что State это объект с name типом String population of и int of type -а.

Я надеюсь, что это имеет смысл.

Спасибо.

Ответ №1:

К сожалению, единственная «простая» инициализация JList с помощью списка — через Vector

 Vector<State> myStates = new Vector();
//add states
JList list = new JList(myStates);
  

Ответ №2:

Самое простое решение — создать DefaultListModel, а затем выполнить итерацию по ArrayList, добавляя объекты состояния в модель списка по ходу работы. Затем используйте эту модель в качестве модели вашего JList. Если, с другой стороны, вы хотите использовать ArrayList в модели, то вам, вероятно, потребуется создать класс, расширяющий класс AbstractListModel , но будьте готовы к тому, что для его эффективной работы придется конкретизировать больше методов этого класса.

Ответ №3:

Все ответы, представленные здесь, великолепны ( 1). На мой взгляд, вам лучше всего создать свою собственную модель, которую вы сможете позже легко использовать, зная, как это работает.

 import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

/**
 * 
 * @author Konrad Borowiecki
 */
public class ObjectDataTableModel extends AbstractTableModel
{
    private static final long serialVersionUID = 1L;
    private List<String> columnNames = new ArrayList<String>();
    private List<List<Object>> data = new ArrayList<List<Object>>();
    public ObjectDataTableModel()
    {
    }

    public void setColumnNames(List<String> cNames)
    {
        this.columnNames = cNames;
    }

    public void setData(List<List<Object>> dbData)
    {
        this.data = dbData;
    }

    public List<List<Object>> getData()
    {
        return data;
    }   

    @Override
    public void setValueAt(Object value, int row, int col)
    {
        List<Object> allRow = this.data.get(row);
        allRow.set(col, value);
    }

    @Override
    public boolean isCellEditable(int row, int col)
    {
        //  if(col == 3){       //set column with id=3 to be not editable
        //      return false;
        //  }
        return false;//true;
    }

    public boolean isDataNull()
    {
        if(this.data == null)
            return true;
        return false;
    }

    @Override
    public int getColumnCount()
    {
        return columnNames.size();
    }

    @Override
    public String getColumnName(int col)
    {
        return columnNames.get(col);
    }

    @Override
    public int getRowCount()
    {
        return data.size();
    }

    @Override
    public Object getValueAt(int row, int col)
    {
        if(data.get(row).isEmpty())
            return null;
        return data.get(row).get(col);
    }
}
  

И здесь у вас есть очень простой пример использования.

 ObjectDataTableModel tm = new ObjectDataTableModel();
        String[] columnNames = new String[]
        {
            "1", "2", "3"
        };//, "4", "5", "6", "7"};
        tm.setColumnNames(Arrays.asList(columnNames));
        int rNo = 30;
        List<List<Object>> data = new ArrayList<List<Object>>(rNo);
        int cNo = columnNames.length;
        for(int i = 0; i < rNo; i  )
        {
            List<Object> r = new ArrayList<Object>(cNo);
            for(int j = 0; j < cNo; j  )
                r.add("i="   i   ", j="   j);
            data.add(r);
        }
        tm.setData(data);
  

Я рекомендую вам всегда иметь такую модель где-нибудь, например, в пакете утилит, доступную и готовую к использованию. Вы увидите, как часто такая простая модель оказывается полезной. Этот идеально подходит для отображения данных любого типа.

Всего наилучшего, Боро.

Ответ №4:

Я полагаю, вы говорите здесь о Matisse GUI builder, в противном случае это должно быть довольно тривиально.

Прежде всего вам нужно создать пользовательскую ListModel

 public class StateListModel extends AbstractListModel{
    private final List<State> list;

    public StateListModel(List<State> list) {
        this.list = list;
    }

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

    @Override
    public Object getElementAt(int index) {
        return list.get(index);
    }

}
  

в конструкторе вашего класса инициализируйте ListModel перед вызовом initComponents() и сделайте его полем, а не локальной переменной.

 stateListModel = new StateListModel(myListofStates);
  

В построителе графического интерфейса NetBeans щелкните правой кнопкой мыши на вашем JList и выберите «настроить код».
Вы увидите что-то вроде jList1.setModel(…) Измените выпадающий список на пользовательское свойство и отредактируйте код для чтения

 jList1.setModel(stateListModel);
  

Ответ №5:

Все эти ответы великолепны и, безусловно, полезны. В итоге я решил это очень просто с помощью контроллера:

view.getStatesList().setListData(model.getStates().toArray());

Ключевым моментом является использование .setListData() (который может принимать массив в качестве аргумента) вместо .setModel() .