2012-05-11 19 views
0

データベースデータをJTableに表示していて、うまくいきました。私は瞬時にデータを更新するためにAbstractTableModelまたはDefaultTableModelを実装する必要があることを知りました。AbstractTableModelをJTableに実装しています。どのようにメソッドを追加するには?

getValueAt()で何を書きますかわかりません。 fireDataChanged()をどこに追加すればよいですか?すべての指導は、ありがとう!ありがとう!

私はこのコードで私のデータベースのデータを取得するために使用:

Vector columnNames = new Vector(); 
Vector data = new Vector(); 

try 
{ 
    Class.forName("com.mysql.jdbc.Driver"); 
    Connection con = DriverManager.getConnection ("jdbc:mysql://localhost:3306/watchlist","root","root");     

    String sql = "SELECT * FROM watchlist"; 
    Statement stmt = con.createStatement(); 
    ResultSet rs = stmt.executeQuery(sql); 
    ResultSetMetaData md = rs.getMetaData(); 

    int columns = md.getColumnCount(); 
    for (int i = 1; i <= columns; i++) 
    { 
     columnNames.addElement(md.getColumnName(i)); 
    }        

    int rowCount = md.getColumnCount();    
    while (rs.next()) 
    { 
     Vector row = new Vector(rowCount); 

     for (int i=1; i <= rowCount; i++) 
     { 
      row.addElement(rs.getObject(i)); 
     } 

     data.addElement(row); 
    } 

    rs.close(); 
    stmt.close(); 
    con.close();          
} 

catch(Exception e) 
{ 
    System.out.println(e); 
} 

マイAbstractTableModelに:ここで

public class MyTableModel extends AbstractTableModel 
{ 
    Vector columnNames = new Vector(); 
    Vector data = new Vector(); 

    public void connectionDB() 
    { 
     try 
     {        
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/watchlist","root","root"); 

      String sql = "SELECT * FROM watchlist"; 
      Statement stmt = con.createStatement(); 
      ResultSet rs = stmt.executeQuery(sql); 
      ResultSetMetaData md = rs.getMetaData(); 
     } 

     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 

    public int getColumnCount() 
    { 
     return columnNames.size(); 
    } 

    public int getRowCount() 
    { 
     return data.size(); 
    } 

    public Object getValueAt() 
    { 
     return data;  
    } 

    public boolean isCellEditable(int row, int col) 
    { 
     return false; 
    } 

} 
+3

公式チュートリアルを終了しましたか?チュートリアルで理解できないことがありますか? –

+3

'public Object getValueAt() { リターンデータ。 .. .. あなたは何をしているのか考えていますか?少なくとも '@ Override'表記を使用してください。種類の備考のために –

+0

ありがとう。私は何をしているのか分からないので、私は尋ねました。多くの例を見てきましたが、私はまだ完全に理解していません。 –

答えて

1

AbstractTableModelを使用してのサンプルです:

public class CustomTableModel extends AbstractTableModel 
{ 
    private static final long serialVersionUID = 1L; 
    private static final String[] columnNames = new String[]{"ID", "Name", "Number", "Yes/No"}; 
    protected List<Foo> lstFoo; 
    protected Class<?>[] types = new Class[]{Integer.class, String.class, String.class, Boolean.class}; 

    public CustomTableModel(List<Foo> lstFoo) 
    { 
     this.lstFoo = lstFoo; 
     fireTableDataChanged(); 
    } 

    @Override 
    public String getColumnName(int columnIndex) 
    { 
     return columnNames[columnIndex]; 
    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) 
    { 
     return types[columnIndex]; 
    } 

    @Override 
    public boolean isCellEditable(int row, int columnIndex) 
    { 
     return false; 
    } 

    @Override 
    public Object getValueAt(int row, int column) 
    { 
     if(row < 0 || row >= lstFoo.size()) return null; 
     Foo obj = lstFoo.get(row); 
     switch(column) 
     { 
      case 0: return obj.getId(); 
      case 1: return obj.getName(); 
      case 2: return obj.getNumber(); 
      case 3: return obj.isYes(); 
      default: return null; 
     } 
    } 

    @Override 
    public int getRowCount() 
    { 
     return lstFoo.size(); 
    } 

    @Override 
    public int getColumnCount() 
    { 
     return columnNames.length; 
    } 
} 
+0

いいえ、申し訳ありません1)[setXxx with fireXxxXxx](http://stackoverflow.com/a/6901508/714968)を追加、2)この回答を削除してください:-) – mKorbel

+0

@mKorbel私が投稿したコードの何が問題ですか? ? –

+0

JTableのビューにAbstractTableModelとsetXxxの値を追加/変更/変更する場合は、1つのセルのみを編集する場合など、JTable構造全体をリフレッシュする理由、Vector baseモデルはList(同じ未完成配列型)であればSQLの方が優れていますが、(ハッシュ)Mapでも構いませんが、Vector >はSQLとよく似ています:-) – mKorbel

0

ただ一点データベースへの接続が2つ多いと、速度が低下し、オーバーヘッドが大きくなります。私はこの問題を抱え、それを解決することができました。

関連する問題