2013-02-27 4 views
1

Я пытаюсь заполнить GUI-конструктор Netbeans jTable, используя данные базы данных Derby.Заполнение jTable с использованием данных базы данных

Я использую следующий код, в моем классе Account.java:

public DefaultTableModel getData() { 
    try { 
     String stmt = "SELECT * FROM APP.DATAVAULT"; 
     PreparedStatement ps = Main.getPreparedStatement(stmt); 
     ResultSet rs = ps.executeQuery(); 
     ResultSetMetaData md = rs.getMetaData(); 
     int columnCount = md.getColumnCount(); 
     Vector columns = new Vector(columnCount); 
     //store column names 
     for (int i = 1; i <= columnCount; i++) { 
      columns.add(md.getColumnName(i)); 
     } 

     Vector data = new Vector(); 
     Vector row; 
     while (rs.next()) { 

      row = new Vector(columnCount); 
      for (int i = 1; i <= columnCount; i++) { 
       row.add(rs.getString(i)); 
      } 
      data.add(row); 

      //Debugging     
     } 

     // List.setModel(tableModel); 

     ps.close(); 
     rs.close(); 
    } catch (SQLException e) { 
     System.out.println(e.getMessage()); 
    } 
    DefaultTableModel tableModel = new DefaultTableModel(data, columns); 
    return tableModel; 
} 

В идеале, я хочу, чтобы иметь возможность вернуть TableModel с данными и столбцами параметров внутри, как я понимаю делаю этот метод в моем графическом интерфейсе есть плохая практика. Все обучающие программы в Интернете не показывают, как отправлять данные в другой класс, они просто выполняют код базы данных в классах GUI.

У меня ошибка, когда он не может видеть данные и столбцы, потому что они объявлены и использованы в недостижимой части моего метода. После того, как я это сделал, мне нужно найти способ передать это в мой GUI-класс и установить модель для моего jTable, созданную разработчиком GUI NetBeans.

Я искал этот сайт для ответов, и я пробовал много решений. Тем не менее, я никогда, кажется, не получаю ничего, чтобы работать из-за того, как я закодировал свою систему. Я также пробовал другие сайты, такие как:

http://tips4java.wordpress.com/2009/03/12/table-from-database/

http://chang.advits.com/populate-data-from-database-into-jtable-in-netbeans < это было бы идеально, но это не сработало. Я последовал за ним в тройник!

и смотрел на Javadocs для JTable, DefaultTableModel и ResultSetTableModel - я ни в коем случае не не пробовали делать это сам, учась и т.д ...

Как я могу идти об этом с тем, как я смоделировал моя система? Кроме того, во всяком случае, чтобы исправить мой метод, или я должен отказаться от него вообще?

ответ

4

Итак, вам нужно каким-то образом «рассказать» таблицу, что модель была загружена. Вы можете использовать механизм обратного вызова слушателя, но вместо этого может быть проще использовать SwingWorker.

Это позволит вам сделать звонок в базу данных в фоновом потоке, а когда она будет завершена, обновите пользовательский интерфейс из EDT.

import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.util.Vector; 
import java.util.concurrent.ExecutionException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JTable; 
import javax.swing.SwingWorker; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import sun.applet.Main; 

public class DataLoadWorker extends SwingWorker<TableModel, TableModel> { 

    private final JTable table; 

    public DataLoadWorker(JTable table) { 
     this.table = table; 
    } 

    @Override 
    protected TableModel doInBackground() throws Exception { 
     Vector data = new Vector(); 
     Vector columns = new Vector(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 
     try { 
      String stmt = "SELECT * FROM APP.DATAVAULT"; 
      ps = Main.getPreparedStatement(stmt); 
      rs = ps.executeQuery(); 
      ResultSetMetaData md = rs.getMetaData(); 
      int columnCount = md.getColumnCount(); 
      //store column names 
      for (int i = 1; i <= columnCount; i++) { 
       columns.add(md.getColumnName(i)); 
      } 

      columns.ensureCapacity(columnCount); 

      Vector row; 
      while (rs.next()) { 

       row = new Vector(columnCount); 
       for (int i = 1; i <= columnCount; i++) { 
        row.add(rs.getString(i)); 
       } 
       data.add(row); 

       //Debugging     
      } 

      // List.setModel(tableModel); 

     } finally { 
      try { 
       ps.close(); 
      } catch (Exception e) { 
      } 
      try { 
       rs.close(); 
      } catch (Exception e) { 
      } 
     } 

     DefaultTableModel tableModel = new DefaultTableModel(data, columns); 
     return tableModel; 
    } 

    @Override 
    protected void done() { 
     try { 
      TableModel model = get(); 
      table.setModel(model); 
     } catch (InterruptedException | ExecutionException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Вы, например, тоже не будете работать.

Vector с columns и data объявляются жгутов контексте try-catch, что означает, что они не будут видны на остальной части способа, так DefaultTableModel tableModel = new DefaultTableModel(data, columns); не компилируется.

Вы должны, по крайней мере, сбросить трассировку стека любых исключений, это поможет вам найти, где на самом деле ошибка, поэтому вместо System.out.println(e.getMessage()); вы должны использовать e.printStackTrace();. Лучшим решением является использование Logger либо от JDK, либо от стороннего регистратора, как log4j.

Вы также являетесь ресурсом, то есть, если вы открываете, вы должны закрыть его. Пока вы вызываете ps.close() и rs.close(), если по какой-либо причине возникает исключение, они не будут вызываться, оставив ресурсы открытыми.

Добавьте их в блок finally вашего try-catch, чтобы убедиться, что они закрыты и приложить все усилия, чтобы закрыть их.

+0

Большое спасибо за помощь. Ваша другая информация о конце в блоке try-catch чрезвычайно полезна! Через несколько часов я перейду через ваш код и реализую его, когда я пойду и вернусь к вам. Еще раз спасибо. –

+0

ОК, я не использовал код как таковой, но его биты, наконец, запустили. Я не уверен, если я буду отмечать его так же корректно, как моя программа все еще не работает, но это помогло мне. Этого достаточно, чтобы отметить это как правильно? –

+0

И что не работает? – MadProgrammer