#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. Спасибо, это сработало, но я признателен, если вы можете опубликовать информацию о том, как создать массив строк.