我目前正在尝试用MySQL学习JTable。我已将数据库设置为JTable,并使用滚动窗格将其添加到我的GUI中。
我的问题是,每当我点击我的按钮时,我怎样才能创建一个更新数据库或执行搜索操作的功能(两者都是相同的......)。
这是我的代码(我正在将数据库信息读入我的.ini文件中)
final Vector columnNames = new Vector();
final Vector data = new Vector();
try
{
// Connect to an Access Database
driver = IniFonksiyon.iniSVNOkut(driver, "databaseBilgileri", "driver");//"com.mysql.jdbc.Driver";
url = IniFonksiyon.iniOkut(url, "databaseBilgileri", "url");//"jdbc:mysql://localhost:3306/";
userid = IniFonksiyon.iniOkut(userid, "databaseBilgileri", "kullanici");
password = IniFonksiyon.iniOkut(password, "databaseBilgileri", "sifre");
dbName = IniFonksiyon.iniOkut(dbName, "databaseBilgileri", "dbIsmi");
Class.forName( driver );
Connection connection = DriverManager.getConnection( url+dbName , userid, password );
// Read data from a table
String sql = "select * from profildb.tbl_detailed";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( sql );
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
// Get column names
for (int i = 1; i <= columns; i++)
{
columnNames.addElement( md.getColumnName(i) );
}
// Get row data
while (rs.next())
{
Vector row = new Vector(columns);
for (int i = 1; i <= columns; i++)
{
row.addElement( rs.getObject(i) );
}
data.addElement( row );
}
rs.close();
stmt.close();
connection.close();
}
catch(Exception e)
{
System.out.println( e );
}
// Create table with database data
final JTable table = new JTable(data, columnNames)
{
/**
*
*/
private static final long serialVersionUID = 1L;
public Class getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
{
return o.getClass();
}
}
return Object.class;
}
};
这是处理创建表的代码,但它与我的主GUI功能直接相关,那么如何刷新/执行搜索功能等其他操作?
答案 0 :(得分:2)
使用表格模型更容易。查看相关的tutorial。您可以使用DefaultTableModel或您自己的TableModel
实施。
如果AbstractTableModel
无法满足您的需求,DefaultTableModel
的扩展通常是最常见的方法。
为了获得更好的Swing应用程序性能和响应能力,不应在EDT上执行长时间运行的任务。因此,最好从EDT以外的线程访问数据库。
SwingWorker可用于此目的。从SwingWorker.doInBackground()
中的数据库中获取数据。然后,在SwingWorker.done()
中构建或更新您的模型。
此类实施有许多变化。这些特定于您的应用程序的性质和要求。例如,您可以使用SwingWorker的publish()/process()
tandem来处理数据块。您可以选择将数据库访问逻辑合并到模型中,也可以创建扩展SwingWorker
的命令。