2013-02-27 1 views
1

Derby 데이터베이스 데이터를 사용하여 Netbeans GUI 빌더 jTable을 채우려고합니다.데이터베이스 데이터를 사용하여 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 클래스 내에서 데이터베이스 코드 만 수행합니다.

데이터와 열이 내 메서드의 도달 할 수없는 부분에서 선언되고 사용 되었기 때문에 데이터와 열을 볼 수없는 오류가 있습니다. 필자가이 작업을 마친 후에는 GUI 클래스에이 방법을 찾고 Netbeans GUI 빌더가 만든 jTable의 모델을 설정해야합니다.

나는이 웹 사이트에서 해답을 찾고 있으며 많은 해결책을 시도해 보았습니다. 그러나 필자는 시스템을 코딩 한 방식으로 인해 아무 것도 작동하지 않는 것으로 보입니다. 나는 또한 같은 다른 웹 사이트를 시도했다 :

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

http://chang.advits.com/populate-data-from-database-into-jtable-in-netbeans <을이 이상적이었을 것이다 그러나 그것은 작동하지 않았다. 나는 티에 그것을 따라 갔다!

와 JTable의, DefaultTableModel를하고 ResultSetTableModel에 대한 Javadoc을 살펴 보았다 - 나는

이 가

내가 모델링 한 방법은이 방법으로이 일에 대해 갈 수 ... 등 학습하여 자신을 일을 시도하지 결코이 내 시스템? 또한, 어쨌든 내 방법을 고쳐야합니까 아니면 내가 그것을 모두 스크랩해야합니까?

답변

4

그래서 모델이로드되었다는 것을 테이블에 "알리는"방법이 필요합니다. 리스너 콜백 메커니즘을 사용할 수도 있지만 대신 SwingWorker을 사용하는 것이 더 쉽습니다.

이렇게하면 백그라운드 스레드에서 데이터베이스를 호출 할 수 있으며, 완료되면 EDT 내에서 UI를 업데이트 할 수 있습니다.

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(); 
     } 
    } 
} 

예도 마찬가지입니다.

Vectorcolumnsdata는, 그래서 DefaultTableModel tableModel = new DefaultTableModel(data, columns);가 컴파일되지 않습니다 그들이 방법의 나머지 부분을 볼 수 없습니다 의미 try-catch의 맥락, withing에 선언됩니다.

적어도 예외의 스택 추적을 덤프하면 실제로 오류가있는 위치를 찾는 데 도움이되므로 System.out.println(e.getMessage()); 대신 e.printStackTrace();을 사용해야합니다. 보다 나은 해결책은 Logger을 JDK 또는 log4j과 같은 타사 로거에서 사용하는 것입니다.

또한 리소스이기도합니다. 즉, 리소스를 열면 닫아야합니다. ps.close()rs.close()을 호출하는 동안 예외가 발생하면 예외가 발생하여 호출되지 않고 리소스가 열려있게됩니다.

try-catch 블록의 finally 블록에이 문자를 추가하여 문자가 닫혀 있는지 확인하고 문자를 닫으려고 최선을 다하십시오.

+0

도움을 많이 주셔서 감사합니다. 마침내 try-catch 블록에 대한 귀하의 다른 정보는 매우 유용합니다! 앞으로 몇 시간 만에 코드를 살펴보고 내가 구현 한대로 구현해 보겠습니다. 다시 한번 감사드립니다. –

+0

좋아요, 나는 그런 코드를 사용하지 않았지만 비트는 마침내 바입니다. 내 프로그램이 여전히 작동하지 않는 것처럼 정확한 것으로 표시해야하는지 잘 모르겠지만 이것이 도움이되었습니다. 올바른 것으로 표시 할만큼 충분합니까? –

+0

그리고 그것에 대해 어떻게 작동하지 않습니까? – MadProgrammer