Итерация 2D-массива результирующего набора в JTable

#java #mysql #arraylist #jtable

#java #mysql #arraylist #jtable

Вопрос:

У меня есть класс resultset, в котором хранятся все операции запроса. Моя проблема в том, что я пытаюсь заполнить jtable данными результирующего набора, но я могу отображать данные только в одном столбце, где у меня их три. Это фрагмент класса resultset:

 public static List<List<String>> getAllFabrics() throws SQLException{
    sql = "SELECT * FROM fabric";

    List<List<String>> values = new ArrayList<>();
    List<String> id = new ArrayList<>();
    List<String> item = new ArrayList<>();
    List<String> supplier = new ArrayList<>();
    stmt = con.createStatement();
    rs = stmt.executeQuery(sql);
    //metaData = rs.getMetaData();
    //int columnNum = metaData.getColumnCount();
    while(rs.next()){
        id.add(String.valueOf(rs.getInt("id")));
        item.add(rs.getString("ItemDesc"));
        supplier.add(rs.getString("Supplier"));

        }
    values.add(id);
    values.add(item);
    values.add(supplier);

    return values;
}
  

и это метод jtable, который я пытаюсь решить часами:

 public static DefaultTableModel loadTable(){
    ModelDB model = null;
    DefaultTableModel tableModel = new DefaultTableModel();
    tableModel.addColumn("ID");
    tableModel.addColumn("Fabric");
    tableModel.addColumn("Supplier");

    try{
        List<String> id = model.getAllFabrics().get(0);
        List<String> item = model.getAllFabrics().get(1);
        List<String> supplier = model.getAllFabrics().get(2);

        //System.out.println(model.getAllFabrics().size()); tableModel.addRow(new Object[]{subRow});
        for(List<String> row:model.getAllFabrics()){
            tableModel.addRow(new Object[]{id,item,supplier});
        }


    }catch(SQLException ex){
        ex.printStackTrace();
    }
    return tableModel;
}
  

Я не могу найти способ итерации значений для отображения в соответствующем столбце.

Комментарии:

1. Вместо того, чтобы формировать список столбцов, попробуйте сформировать список строк данных, а затем выполнить итерацию и отобразить данные в Jtable

2. Вместо того, чтобы формировать данные по столбцам, сформируйте список по строкам, а затем выполните итерацию и отобразите данные в JTable

Ответ №1:

Оригинальный ответ

Вы почти на месте! Вам нужно только изменить цикл:

 for(int i = 0; i < id.size(); i  ) {
    tableModel.addRow(new Object[] {id.get(i),item.get(i),supplier.get(i)});
}
  

Но, как сказано в комментариях, вам следует рассмотреть возможность перехода на массив строк, а не столбцов.

Редактировать

Это один из подходов. Это в основном то же самое, что и ваш код, за исключением того, что строки / столбцы меняются местами, поэтому метод возвращает список строк, а не столбцов:

 public static List<List<String>> getAllFabrics() throws SQLException{
    sql = "SELECT * FROM fabric";
    List<List<String>> values = new ArrayList<>();
    stmt = con.createStatement();
    rs = stmt.executeQuery(sql);
    while(rs.next()){
        List<String> row = new ArrayList<>();
        row.add(String.valueOf(rs.getInt("id")));
        row.add(rs.getString("ItemDesc"));
        row.add(rs.getString("Supplier"));
        // Now row contains {id, item, supplier}
        values.add(row);
    }
    return values;
}
  

Затем в вашем методе loadTable() измените на:

 ...

try{
    for(List<String> row: model.getAllFabrics()){
        tableModel.addRow(row.toArray(new String[row.size()]);
    }
...
  

В вашем исходном коде вы вызываете model.getAllFabrics() несколько раз, чтобы получить возвращаемое значение. Это нехорошо, потому что каждый раз, когда вы это делаете, вызывается метод, и ему нужно снова выполнить SQL-запрос и т.д. Вместо этого сохраните возвращаемое значение в переменной. В этом случае, хотя, поскольку возвращаемое значение доступно только один раз, вы можете в равной степени просто сделать, как я описал выше.

Надеюсь, это поможет 🙂

Комментарии:

1. Я не знаю, как, и это первый раз, когда я работаю с java, потому что мой последний проект был на php.

2. Спасибо, это сработало, но я признателен, если вы можете опубликовать информацию о том, как создать массив строк.