Пользовательские классы и JLists - PullRequest
1 голос
/ 18 апреля 2011

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

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

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

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

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

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

Надеюсь, это имеет смысл.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 18 апреля 2011

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

Vector<State> myStates = new Vector();
//add states
JList list = new JList(myStates);
2 голосов
/ 18 апреля 2011

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

Прежде всего вам необходимо создать пользовательскую 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);
2 голосов
/ 18 апреля 2011

Все ответы, представленные здесь, отличные (+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);

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

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

2 голосов
/ 18 апреля 2011

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

0 голосов
/ 19 апреля 2011

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

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

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

...