#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()
.