2010-02-04 29 views
1

我想显示一个数据库表作为JTable。我从来没有使用过JTable,所以我使用JTable和TableModel。用于Java中JTable的JDBC TableModel?

随着那google搜索,我可以写我自己的自定义的TableModel这显示存储在

Object[][] data; 

现在的数据,我想表明我的数据库表中的数据到JTable中。我也搜索了这个,并对此有了一个了解,但仍然对AbstractTableModel的实现类中应该出现什么问题感到困惑。

以下是自定义TableModel的代码。现在

public abstract class AbstractPOLDATTableModel extends AbstractTableModel { 
protected boolean DEBUG = false; 
private String[] columnNames; 
private Object[][] data; 

protected AbstractPOLDATTableModel(String[] columnNames, Object[][] data) { 
    this.columnNames = columnNames; 
    this.data = data; 
} 

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

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

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

public Object getValueAt(int row, int col) { 
    return data[row][col]; 
} 

@Override 
public Class getColumnClass(int c) { 
    return getValueAt(0, c).getClass(); 
} 

@Override 
public boolean isCellEditable(int row, int col) { 
    if (col < 2) { 
     return false; 
    } else { 
     return true; 
    } 
} 

@Override 
public void setValueAt(Object value, int row, int col) { 
    if (DEBUG) { 
     System.out.println("Setting value at " + row + "," + col 
          + " to " + value 
          + " (an instance of " 
          + value.getClass() + ")"); 
    } 

    data[row][col] = value; 
    fireTableCellUpdated(row, col); 

    if (DEBUG) { 
     System.out.println("New value of data:"); 
     printDebugData(); 
    } 
} 

private void printDebugData() { 
    int numRows = getRowCount(); 
    int numCols = getColumnCount(); 

    for (int i=0; i < numRows; i++) { 
     System.out.print(" row " + i + ":"); 
     for (int j=0; j < numCols; j++) { 
      System.out.print(" " + data[i][j]); 
     } 
     System.out.println(); 
    } 
    System.out.println("--------------------------"); 
} 
} 

,如何更改上面的代码,使我的JTable中可以有follwing特点:

  1. 它显示数据库中的数据
  2. 用户可以直接编辑表,他点击时在“保存”按钮上,更改反映在数据库数据中
  3. 用户可以直接插入数据。
  4. 用户可以直接删除数据。
+0

你在哪里给你最后发表的工作示例。 – camickr

+0

昨天你问了几乎相同的问题:http://stackoverflow.com/questions/2192764/how-to-fill-data-in-a-jtable-with-database – sateesh

+0

Yatendra - 看看我昨天的例子问题并告诉我你卡在哪里,我会尽力给你一些指示。 – Adamski

回答

1

我假设你已经实施了1根据Adamski在你的上一个问题中提出的建议。另外,正如Sanoj所建议的,更改为使用某种List来存储数据。

  1. 为了支持2-4,你必须确保你拉出数据库的数据来源只有一个表,不涉及衍生的数据(例如,聚合,列1 +列2)。如果您打算让用户过滤行,则需要跟踪您的where子句。

  2. 在每行中,存储另一行(我们称之为updatedRow),它表示用户使用GUI进行的更新。一旦对该行进行了任何更新,该字段需要填充包含更新数据的新行。单击“保存”后,您将对所有具有非空updatedRow的行运行更新查询,并使用updatedRow中的数据更新数据库,这些数据与原始行中的数据不匹配(如果用户将数据更改回原样,则不更新它原来是)。您可能还有另一个“撤消更新”按钮,该按钮使用非空updatedRow为所有行填充原始数据。

    我强烈建议您存储额外的元数据在哪些字段形成主键,并防止更改这些列,因为更新此类列可能会很昂贵(因为它们可能是索引,并可能有一些RI约束附加)。这应该通过使这样的列不可编辑来反映在GUI中。更新中的where子句将只使用这些字段而不是所有字段(您仍然需要其他用户在1中设置的过滤器)。

  3. 我建议分两步进行。用户通过点击一个按钮来添加一行到表格。输入数据后,用户单击另一个按钮以插入数据库(或者可以将此功能与“保存”按钮中的更新组合)。如果主键列不是某些自动生成的ID,则需要允许主键字段对新插入的行进行编辑。

    为了区别哪些行已经在数据库中,哪些不在,我建议存储新插入的行的列表。

    如果您让用户只挑选某些列以在表中显示,您需要确定如何处理未显示的列(例如,让数据库设置默认值,填充自动生成的ID)。

  4. 可能最好是通过每行都有一个复选框来实现这一点,然后当单击“删除”按钮时,它会调用SQL删除每个选中的行,使用1中的过滤器和2中提到的主键元数据以及将其从桌面上移除。

一般考虑:

  • 同样的setValueAt方法将同时用于更新和插入的行,但你想不同的行为。你想为更新设置updatedRow,但不是在编辑你要插入的行时。

  • 你将如何处理诸如约束未被满足或输入无效的错误(例如数字字段中的'abcde')?

  • SQL注入。