我正在处理的程序包含两个类,GUI& DatabaseHelper。使用的表模型是DefaultTableModel。
GUI包含一个简单的JTable。它在启动时使用DatabaseHelper中的数据进行初始化。这很有效。
但是,当尝试将新数据加载到表中时,它并不是那么直接。
到目前为止我的方法是:
model = DatabaseHelper.LoadData() // returns a default table model with new data.
tabel = new JTable();
tabel.setModel();
现在发生的事情是加载的数据被附加到已经存在的JTable上。
如果可能,我想仅使用默认表模型来实现解决方案。谢谢你的任何建议!
编辑:
public void initGUI(){
setJMenuBar(makeMenuBar());
container = new JPanel(new BorderLayout());
model = db.initialiseTable(); // Load initialisation data from the database
table = new JTable();
table.setModel(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
scrollPane = new JScrollPane(table);
container.add(scrollPane, BorderLayout.CENTER);
add(container);
}
从数据库返回新模型:
public DefaultTableModel loadData(){
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/version1", "root", "root");
System.out.println("\nDatabase Connection Established.\n");
String query = "SELECT * FROM table WHERE test_number = 2";
stmt = con.createStatement();
rs = stmt.executeQuery( query );
md = rs.getMetaData();
columns = md.getColumnCount();
while (rs.next()) {
Vector row = new Vector(columns);
for (int i = 1; i <=columns-1; i++){
row.addElement( rs.getObject(i+1) );
}
data.addElement( row );
}
}catch(SQLException e){
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
columnNames.add(" ");
columnNames.add("Column 1");
columnNames.add("Column 2");
DefaultTableModel model = new DefaultTableModel(data, columnNames);
return model;
}
ActionPerformed,代码处理从DatabaseHelper返回的新模型
model = new DefaultTableModel();
model = db.loadData();
table = new JTable();
table.setModel(model);
答案 0 :(得分:1)
DatabaseHelper.LoadData()
可能存在错误。出于某种原因,它不会创建新模型,但始终返回相同的模型。
在DatabaseHelper.LoadData()
中创建一个新模型,它应该有用。
答案 1 :(得分:1)
model = DatabaseHelper.LoadData() // returns a default table model with new data.
tabel = new JTable();
tabel.setModel();
您可能最重要的问题是重新创建TableModel
和JTable
,并且JTable
这个新的TableModel
实例未添加到GUI
{1}},不要这样做,没有真正的理由......
搜索ResulsetTableModel
(仅传递SQL Query
)或使用优秀代码Table from Database @camickr
答案 2 :(得分:0)
首先,看起来你在动作处理程序中有额外的实例化:
model = new DefaultTableModel();
model = db.loadData();
table = new JTable();
table.setModel(model);
loadData
方法会为您实例化DefaultTableModel
,因此您可以跳过new DefaultTableModel
并且已经使用JTable
方法中的initGui
,因此您应该只是引用现有的Component
。
现在,您似乎只是添加到columnNames
对象。也许您需要清除它或每次重新实例化?如果loadData
被多次调用,则在columnNames
方法之外创建loadData
会更加清晰。在那里添加“”,“第1列”和“第2列”,仅在loadData
内引用它。