2014-03-04 53 views
1

我有工人从下面的resultset填充jtable;从表结果集填充结果集时更改jtable的列类型

public class WorkerFillTable extends SwingWorker<DefaultTableModel, DefaultTableModel> { 
     private DefaultTableModel modeltable; 
     public WorkerFillTable(DefaultTableModel modeltable) { 
     this.modeltable = modeltable; 
     } 
     @Override 
    protected DefaultTableModel doInBackground() throws Exception { 
      ResultSet rs; 
      Statement stmt; 
      String query = "select Name,ID,Status,IsActive from current_conf\n" + 
      "order by Name,ID"; 

      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
      String connectionUrl = "jdbc:sqlserver://192.168.130.100;" + "databaseName=DBST;" + "user=" + "user1" + ";" + "password=" + "userpass1" + ";"; 
      Connection con = DriverManager.getConnection(connectionUrl); 
      stmt = con.createStatement(); 
      rs = stmt.executeQuery(query); 
      ResultSetMetaData rsmd = rs.getMetaData(); 

      Vector<String> columnNames = new Vector<String>(); 
      int columnCount = rsmd.getColumnCount(); 

      for (int column = 0; column < columnCount; column++) { 
       columnNames.addElement(rsmd.getColumnLabel(column + 1)); 
      } 

      Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 

      while (rs.next()) { 
       Vector<Object> vector = new Vector<Object>(); 
       for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 
       vector.add(rs.getObject(columnIndex)); 
       } 
       data.add(vector); 
      } 

      rs.close(); 
      stmt.close(); 
      modeltable = new DefaultTableModel(data, columnNames); 
      return modeltable; 
     } 


     @Override 
     protected void done() { 
     try { 
      TableModel modeltable = get(); 
      sorter = new TableRowSorter(modeltable); 
      cTable.setRowSorter(sorter); 
      cTable.setModel(modeltable); 
     } catch (InterruptedException | ExecutionException ex) { 
     } 
     } 

    } 

但所有的列都是字符串。 DB的“IsActive”列有点只有“1”或“0”Jtable将此列显示为“true”或“false”我需要在jtable中编辑最后一列typr到boelan。我该怎么做 ?

+0

编辑:“IsActive”列的数据库是有点只有“1”或“0” –

+0

做了你的官方ORACLE教程“如何使用表”,事件调度线程,SwingWorker,从来没有创建Swing JComponents其模型在工作者线程(doInBackground()) – mKorbel

+0

@mKorbel是的,我读过它们。上面的代码现在成功地工作。只是我想看到列4中的复选框,而不是真或假的字符串。我没有回转工的问题。 –

回答

4

JDBCAdapter,其延伸AbstractTableModel,示出了关系数据库和Java数据类型之间的典型映射。可能会看到here,并且可以在samples/demo/jfc/TableExample中找到完整的示例,发现在Java SE Development Kit 8u25 Demos and Samples Downloads之间。概括而言,

  • 重写getColumnClass()

  • ResultSetMetaData获取色谱柱的数据type

  • 使用switch(type)返回正确的type-token

还要考虑一个SwingWorker<Row, Row>为更细的粒度在publish()/process()

+1

我认为我必须研究这个AbstractTableModel。我以前不使用。我可以按照你的链接。感谢您的建议。 –

0

我建议您使用AbstractTableModel的子类并重写getColumnClass方法来为JTable设置正确的数据类型。

public class CustomTableModel extends AbstractTableModel 
{ 
    @Override 
    public int getRowCount() 
    { 
    } 

    @Override 
    public int getColumnCount() 
    { 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) 
    { 
    } 

    @Override 
    public String getColumnName(int index) 
    { 
    } 

    @Override 
    public Class<String> getColumnClass(int i) 
    { 
     //return the Specific class for each column based on index i 
    } 

} 
+0

感谢您的建议。 –