2014-01-27 3 views
0

Я пытаюсь отобразить часть набора результатов в JTable (Два столбца), мне остается только увидеть одну строку. JTable находится в существующем графическом интерфейсе, а набор результатов передается методу в классе GUI. Когда я делаю Vector size(), он возвращает один. Это говорит мне, что в списке есть только одна запись. Я должен видеть в 4 записи. Запись, которую я вижу, является последней из того, что я ожидаю, будет 4.JTable только отображает 1 строку

См. Метод ниже: Любая помощь будет высоко оценена.

public static void getResultSet(ResultSet resultSet) throws SQLException { 

     ResultSetMetaData metaData = resultSet.getMetaData(); 

        //JTable name is resultsTable includes Scrollpane 


     // names of columns 

     Vector<String> columnNames = new Vector<String>(); 
     int columnCount = 2; 
     for (int column = 1; column <= columnCount; column++) { 
      columnNames.add(metaData.getColumnName(column)); 
      System.out.println("ColumnNames "+columnNames); 
     } 

    // data from the table 

     // Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
     Vector<Vector<String>> data = new Vector<Vector<String>>(); 
     while (resultSet.next()) { 
      Vector<String> vector = new Vector<String>(); 
      for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 
       vector.add(resultSet.getString(columnIndex)); 
      } 

      data.add(vector); 
      System.out.println("Vector Value = "+ data); 
      System.out.println("Vector Size =" + data.size()); //Returning 1 - Should see 4 entries 

      DefaultTableModel datamodel = new DefaultTableModel(data,columnNames); 
      resultsTable.setModel(datamodel); 


     } 

ответ

3

«Это говорит мне, что есть только одна запись в списке. Я должен видеть на 4 записей въездной Я видящих является последним из того, что я ожидал бы 4.»

Вы создаете новую DefaultTableModel каждую итерацию. Не делай этого.

DefaultTableModel datamodel = new DefaultTableModel(data,columnNames); 
resultsTable.setModel(datamodel); 

Возьмите вышеуказанное. Вместо этого сначала установите модель. Затем просто .addRow(row) в петле

for (int column = 1; column <= columnCount; column++) { 
    columnNames.add(metaData.getColumnName(column)); 
    System.out.println("ColumnNames "+columnNames); 
} 
DefaultTableModel datamodel = new DefaultTableModel(columnNames, 0); 
table.setModel(datamodel); 

while (resultSet.next()) { 
    Vector<String> vector = new Vector<String>(); 
    for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 
     vector.add(resultSet.getString(columnIndex)); 
    } 
    datamodel.addRow(vector); 
} 

Конструктор для DefaultTableModel(columnNames, 0) где 0 это количество начальных строк. Итак, все, что вам нужно сделать, это динамически добавлять строки по одному в while(rs.next()). Для каждой строки данных, которые вы получите в Vector только datamodal.addRow(vector)


UPDATE

Как я уже сказал, я не знаю, что вы делаете неправильно, но нет ничего плохого с моим кодом. Вот тестовая программа

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.util.Vector; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 

public class TestTableModel { 

    private ResultSet resultSet = null; 

    public TestTableModel() throws SQLException { 
     initDB(); 

     JTable table = new JTable(getModel(resultSet)); 
     JScrollPane scroll = new JScrollPane(table); 

     JFrame frame = new JFrame("Test Table Model"); 
     frame.add(scroll); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        TestTableModel testTableModel = new TestTableModel(); 
       } catch (SQLException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
    } 

    private DefaultTableModel getModel(ResultSet resultSet) throws SQLException { 
     ResultSetMetaData metaData = resultSet.getMetaData(); 
     int columnCount = metaData.getColumnCount(); 
     Vector<String> columnNames = new Vector<>(); 

     for (int column = 1; column <= columnCount; column++) { 
      columnNames.add(metaData.getColumnName(column)); 
      System.out.println("ColumnNames " + columnNames); 
     } 
     DefaultTableModel dataModel = new DefaultTableModel(columnNames, 0); 

     while (resultSet.next()) { 
      Vector<String> vector = new Vector<>(); 
      for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 
       vector.add(resultSet.getString(columnIndex)); 
      } 
      dataModel.addRow(vector); 
     } 


     return dataModel; 
    } 

    private void initDB() throws SQLException { 
     Connection conn = null; 
     PreparedStatement ps = null; 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      conn = DriverManager.getConnection(
        "jdbc:mysql://localhost/...", "...", "..."); 
      ps = conn.prepareStatement("SELECT * FROM city"); 
      resultSet = ps.executeQuery(); 

     } catch (ClassNotFoundException | SQLException ex) { 
      ex.printStackTrace(); 
     } 

    } 
} 

enter image description here

+0

К сожалению Peeskillet нет радости. По-прежнему получал тот же ответ только за одну запись. – user3240355

+0

Тогда в вашем коде что-то еще не так, что вы не показываете нам. Этот способ работает для меня каждый раз. –

+0

См. Мое ** ОБНОВЛЕНИЕ **. Вам нужно проверить где-то еще в вашем коде, потому что мой код в порядке –

Смежные вопросы