自定义类和JLists



我在一个Java项目的NetBeans工作。

我需要显示每个State(例如:"Oklahoma")在ArrayList<State>中在JList中。

我不知道该怎么做……

认为它涉及到创建一个DefaultListModel,每个State作为String。我试过无数种不同的方法,但都无济于事。

是否有可能只是加载ArrayList<State>(也许如果State类有toString()方法)?这将特别有用,因为我可以通过actionPerformed()直接修改ArrayList<State>

为了方便起见,我们假设State是一个name类型为String, population类型为int的对象。

我希望这有意义。

谢谢。

不幸的是,只有通过Vector

才能"简单"地初始化List。
Vector<State> myStates = new Vector();
//add states
JList list = new JList(myStates);

最简单的解决方案是创建一个DefaultListModel,然后遍历ArrayList,将State对象添加到列表模型中。然后使用这个模型作为JList的模型。另一方面,如果您希望在模型中使用ArrayList,那么您可能需要创建一个扩展AbstractListModel类的类,但是要准备好充实该类的更多方法以使其正常工作。

这里提供的答案都很棒(+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);

我建议你把这样一个模型放在某个地方,例如在一个实用程序包中,可以随时使用。您将看到这样一个简单的模型是多么有用。这是完美的显示任何类型的数据

祝你一切顺利。

我想你在这里谈论的是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);
    }
}
在你的类的构造函数中

在 initComponents()被调用之前初始化ListModel ,并使它成为一个字段而不是一个局部变量。

stateListModel = new StateListModel(myListofStates);

在NetBeans GUI构建器中右键单击JLIst,然后选择"自定义代码"。您将看到jList1.setModel(…)将下拉菜单更改为自定义属性并编辑代码以读取

jList1.setModel(stateListModel);

所有这些答案都很棒,当然也很有用。我最终通过控制器非常简单地解决了这个问题:

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

关键是使用.setListData()(可以接受Array作为参数)而不是.setModel()

相关内容

  • 没有找到相关文章

最新更新