簡體   English   中英

使用ArrayList填充JTable <String>

[英]Populating a JTable using ArrayList<String>

所以我嘗試使用我的arraylist填充jtable,我也想保留3層架構

我的DAL從文件中讀取數據,然后嘗試將其填充到表中

   public class E {
         public  ArrayList<String> getinformationforthetable() {
        Scanner s = null;
          ArrayList<String> data = new  ArrayList<String>();
        try {
            s = new Scanner(new File("songs.txt"));
            while (s.hasNextLine()) {
            String line = s.nextLine();
            if (line.startsWith("")) {
                String[] atoms = line.split("[#]");
                 ArrayList<String> row = new  ArrayList<String>();
                row.add(atoms[0]);
                row.add(atoms[1]);
                        row.add(atoms[2]);
                        row.add(atoms[3]);
                        row.add(atoms[4]);
                        row.add(atoms[5]);
                data.addAll(row);
            }
            }
        }
        catch(IOException e) {
            e.printStackTrace();    
        }
        finally {
            if (s != null) {
            s.close();
            }
        }
        return data;
        }

    }

我的UI

我想用之前擁有的arraylist填充表模型,但是我不確定該怎么做。

public class setTableModel extends AbstractTableModel{
   private static final String[] COLUMN_HEADERS =
    {
        "Title", "Artist", "Gengre", "Quality", "Duration","Favorite"
    };
    private static final Class[] COLUMN_TYPES =
    {
       String.class, String.class,String.class,String.class, Integer.class, Boolean.class
    };
    @Override
    public int getRowCount() {
        return COLUMN_HEADERS.length;
    }

    @Override
    public int getColumnCount() {
       return null;
       //todo
    }

    @Override
    public Object getValueAt(int i, int i1) {
       return null;
      //todo
    }

}

不要使用ArrayList。

String[] atoms = line.split("[#]");
//ArrayList<String> row = new  ArrayList<String>();
model.addRow( atoms );

您已經在數組中存儲了數據。 您可以使用DefaultTableModel的addRow(...)方法,該方法將獲取數組中的數據並將數據添加到您的模型中。

因此,更改您的方法簽名。 而不是返回ArrayList,您應該返回DefaultTableModel。 然后,您可以使用模型創建JTable。

我可以看到的一個問題是ArrayList的結構。 它只是一維的。 JTable / TableModel數據必須是二維rows/columns

如果使getinformationforthetable()返回ArrayList<ArrayList<String>>則可以更輕松地填充表。

同樣,您也可以extends DefaultTableModel 我看不到您的AbstractTableModel添加任何特殊功能。 然后,您可以使用DefaultTableModel addRow方法添加行。 像這樣

DefaultTableModel model = new MyDefaultTableModel();
E e = new E();
ArrayList<ArrayList<String>> list = e.getinformationforthetable();
for (ArrayList<String> row : list) {
    model.addRow(row.toArray());
}
table.setModel(model);

甚至根本不擴展DefaultTableModel 您可以覆蓋它的getColumnClass() ,就像這樣

private static final String[] COLUMN_HEADERS =
{
    "Title", "Artist", "Gengre", "Quality", "Duration","Favorite"
};
DefaultTableModel model = new DefaultTableModel(COLUMN_HEADERS, 0) {
    @Override
    public Class getColumnClass(int column) {
        switch (column) {
            case 0: return String.class; break;
            case 1: return String.class; break;
            ...
        }
    }
};

在您的示例中,您需要setTableModel (應將其重命名為SetTableModel以與Java樣式保持一致)來維護數據。 當前,您將數據保留在E

您可以像addRow(String)一樣向SetTableModel添加一個方法,該方法可以進行split並將數據保留在SetTableModel

然后,當您覆蓋getValueAt(int row, int column) ,將從本地數據中提取。

另外, getColumnCount()可能return COLUMN_HEADERS.lengthgetRowCount()應該返回本地數據中維護的行數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM