2012-12-03 3 views
0

데이터베이스 정보를 테이블에 표시하는 것에 관해서이 사이트에 대한 이전의 조언을 따라 왔지만 지금까지는 작동하지 않습니다. mainTable이라는 테이블을 가진 Netbeans Dialog를 생성했습니다. MySql에서 가져온 ResultSet으로 Model을 설정하고 있습니다.JDBC에서 JTable으로 데이터 표시하기

EDIT 전체 클래스 :

import swing.SwingUtilities; 
import javax.java.awt.Dialog; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.util.Vector; 

import javax.swing.JDialog; 
import javax.swing.JOptionPane; 

swing.table.DefaultTableModel; 

public class AddressBookImpl extends AddressBookGui implements ActionListener { 
final static AddressBookImpl impl = new AddressBookImpl(); 
DefaultTableModel defaultTableModel = new DefaultTableModel(); 
AddressBookGui gui = new AddressBookGui(); 



public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override public void run() { impl.startGUI(); }}); 
} 

public void startGUI(){ 
    gui.main(null); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    this.setResizable(true); 
    this.setTitle("Address Book"); 
    listeners(); 
    refreshTable(); 
} 

public DefaultTableModel refreshTable() { 
    try{ 

     DatabaseImpl dbimpl = new DatabaseImpl(); 
     dbimpl.refreshDatabase(); 
     ResultSet refreshResult = dbimpl.refreshResult; 
     ResultSetMetaData meta = refreshResult.getMetaData(); 
     int numberOfColumns = meta.getColumnCount(); 

     while (refreshResult.next()) 
     { 
      Object[] rowData = new Object[numberOfColumns]; 

      for (int i = 0; i < rowData.length; ++i) 
      { 
       rowData[i] = refreshResult.getObject(i + 1); 
      } 
      defaultTableModel.addRow(rowData); 
     } 
     this.defaultTableModel = defaultTableModel; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    gui.mainTable.setModel(defaultTableModel); 
    return defaultTableModel; 
} 


public void listeners() { 
    quitFileMenuBar.addActionListener(this); 
    addButton.addActionListener(this); 
    refreshButton.addActionListener(this); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getActionCommand().equalsIgnoreCase("Quit")) 
    { 
     this.dispose(); 
    } 
    if (e.getActionCommand().equalsIgnoreCase("Add")) 
    { 
     // Add a new address to the DB 
    } 
    if (e.getActionCommand().equalsIgnoreCase("About")) 
    { 

    } 
    if (e.getActionCommand().equalsIgnoreCase("Refresh")) 
    { 
     refreshTable(); 
     System.out.println("Refreshing........"); 
    } 
} 
} 

그리고 DatabaseImpl 클래스 :

protected ResultSet refreshDatabase() { 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     con = DriverManager.getConnection(url, user, password); 
     System.out.println("Connection is created to " + url); 

     Statement statement = con.createStatement(); 
     String selectAllQuery = "Select * from " + table + ";"; 

     ResultSet refreshResult = statement.executeQuery(selectAllQuery); 
//   con.close(); 
     this.refreshResult = refreshResult; 
     return refreshResult; 

    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return refreshResult; 
} 

그러나 이것은 단지 테이블이 있어야 할 빈 영역, 도움이 보여?

GUI 클래스는 표준 netbeans 생성 클래스입니다.

+0

코드에 약간의 리팩토링이 필요합니다 ... AdderssBookGui는 테이블이 표시된 대화 상자입니까? 'TableModel'을 설정 한 후에 왜 그것을 폐기하고 있습니까? 또는 (TableModel을 반환하기 때문에)이 메서드의 호출자가 설정 한'TableModel'을 가져옵니다. – Kai

+0

AddressBookGui 대화 상자입니다 예, 나는 처분을 제거하고 여전히 작동하지 않습니다, 나는 AddressBookGui 클래스에 직접 TableModel을 추가하려고했으나이 메서드를 호출하는 것을 의미했습니다. 그리고이 클래스를 확장하면 루프 및 스택 오버플로 오류 준. –

+0

그것은 DB에 연결하여 ResultSet Works가 잘 작동하고 rowData가 DB에 있던 정보를 보유하고 있기 때문에 JTable에 적용되지 않습니다. –

답변

2

TableModel을 현재 시각화 된 AddressBookGui 인스턴스가 보유하지 않는 잘못된 JTable에 전달하는 것처럼 보입니다. 새로 생성 된 AddressBookGui 인스턴스의 JTable을 설정하면 시각화 된 객체에 아무런 영향을 미치지 않으므로 같은 클래스의 인스턴스 인 경우에는 서로 독립적입니다. 해결 방법은이 모델을 실제로 시각화 된 AddressBookGui 인스턴스가 보유하고있는 JTable에 전달하는 것입니다. 나쁜 해결책은 정적 필드를 사용하는 것입니다. 그냥 하지마.

편집
나는 당신의 문제가 상속의 복잡한 오용 함께 다시 비 시각의 JTable의 모델을 설정하는 것이라고 생각합니다. 귀하의 코드 줄 gui.main(null)이 AddressBookGui 인스턴스를 만들고 표시하는 정적 메인 메서드를 호출하고이 사람이 JFrame을 보유하고 있다고 의심됩니다. 그렇다면 다시 표시되는이 AddressBookGui 인스턴스는 이 아니며 gu30 변수가 보유한 것과 동일합니다.입니다.

난 당신이 AddressBookImpl이 AddressBookGui 확장이 아니라 단순히 AddressBookGui의 인스턴스를 잡고 있고, 당신이 AddressBookGui의 주요 메소드를 호출하지 않는 것이 아니라 AddressBookImpl이 AddressBookGui 인스턴스를 표시하기위한 책임이없는 것이 좋습니다.

+0

죄송합니다. 조금 혼란 스럽습니다. .setmodel (....); GUI 클래스에서 가져오고이 메서드는 클래스가 시각화되기 전에 호출됩니다. –

+0

@MattC : 생성 된 모델을 실제로 시각화 된 JTable에 추가하는 위치를 보여줍니다. –

+0

@MattC : 나는 당신의 문제와 해결책을 이해한다고 생각합니다. 위의 답을 편집하십시오를 참조하십시오. –

관련 문제