【发布时间】:2015-08-12 08:34:13
【问题描述】:
我有一个使用 SQL Query 填充的 JTable。我还使单元格可编辑,我编辑的任何单元格都没有保存,它只是恢复到我完成编辑后的状态。
我不完全确定使 JTable 完全可编辑的正确方法是什么,并且任何正在更新的单元格都将保存在 JTable 本身上,并将在 SQL 数据库上得到更新。
我想我应该将 TableModelListener 与 fireTableCellUpdated 一起使用,但我无法让它工作。
这是我用来显示 JTable 的代码
import java.sql.*;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;
import java.awt.Dimension;
import java.awt.event.*;
import java.util.*;
@SuppressWarnings("serial")
public class Test_Table extends JPanel {
//Load Componenets
JTable table;
static TableModel dataModel;
static Connection conn;
static Statement stmt;
static Vector<Vector<String>> resultVector=new Vector<Vector<String>>();
static Vector<String> fieldVector=new Vector<String>();
String[] col_name = {"A","B","C","D","E","F","G"};
//Get Data from SQL Database
public static void getTableData(Vector<Vector<String>>resultVector, Vector<String>fieldVector) throws SQLException {
fieldVector.clear();
resultVector.clear();
int colCount;
String query="SELECT *FROM test_table WHERE DATE(time_stamp)=CURDATE() ORDER BY time_stamp DESC";
ResultSet result;
result=stmt.executeQuery(query);
ResultSetMetaData metaData=result.getMetaData();
colCount=metaData.getColumnCount();
for (int i=0; i<colCount; i++)
fieldVector.add(metaData.getCatalogName(i+1));
for (int i=0; result.next(); i++) {
resultVector.add(new Vector<String>());
for (int j=0; j<colCount; j++)
resultVector.get(i).add(result.getString(j+1));
}
}
public Test_Table() throws SQLException, ClassNotFoundException {
//Connection to the SQL Database
Class.forName("com.mysql.jdbc.Driver");
final String url = "jdbc:mysql://localhost:3306/test_table";
final String username = "";
final String password = "";
conn=DriverManager.getConnection(url, username, password);
stmt=conn.createStatement();
//Model to Create JTable filled with SQL Database
getTableData(resultVector,fieldVector);
dataModel=new AbstractTableModel(){
public int getColumnCount() {return fieldVector.size();}
public int getRowCount() {return resultVector.size();}
public Object getValueAt(int row, int col) {
return resultVector.get(row).get(col);
}
public boolean isCellEditable(int row, int col) {
return true;
}
public String getColumnName(int index) {
return col_name[index];
}
};
//Adds TableMode Listener
dataModel.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
try {
tableModelTableChanged(e);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
});
//Create JTable with Database and add to JPanel
table=new JTable(dataModel);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.setPreferredScrollableViewportSize(new Dimension(1500,400));
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( SwingConstants.CENTER );
table.setDefaultRenderer(Object.class, centerRenderer);
final JScrollPane scrollpane=new JScrollPane(table);
add(scrollpane);
}
public void tableModelTableChanged(TableModelEvent evt) throws SQLException{
?????????
}
//Update JTable when new row Inserted
public static void update_table() throws SQLException {
getTableData(resultVector, fieldVector);
((AbstractTableModel) dataModel).fireTableDataChanged();
}
//Close SQL Connection
static void close() throws SQLException {
if (stmt!=null)stmt.close();
if(conn!=null) conn.close();
}
public void processWindowEvenet(WindowEvent e) {
if (e.getID()==WindowEvent.WINDOW_CLOSING) {
try {
Testing_Table.close();
}
catch (SQLException e1) {
e1.printStackTrace();
}
System.exit(0);
}
}
public static void main (String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException, SQLException {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
JFrame frame=new JFrame();
frame.add(new Testing_Table());
frame.pack();
frame.setVisible(true);
}
}
【问题讨论】:
-
1.您必须使用 SwingWorker、Runnable#Thread 进行 JDBC#UPDATE...、2. 覆盖 JTable.setValueAt、3. JDBC#Connection.OPEN / CLOSE 在运行时是硬而长的事件,4。如果出现故障(单独的类。void,必须包含 JTable / XxxTableModel 中的原始坐标),则从 JDBC 创建一些通知程序(即向屏幕返回异常)