我正在尝试使用ListTableModel,并尝试在线跟踪一些示例,但仍然发现很难在Jtable中显示"resultSet"数据。我使用模型视图控制器方法在netbeans中构建GUI应用程序。我的所有GUI组件都放置在视图中,控制器正在处理任何更新以及该视图的可见性。模型类拥有所有的查询,并负责使用JDBC直接访问数据库。
"Jtable"searchTable"是在视图类中创建和初始化的,并且由我的控制器通过方法(getSearchTable())访问。
public JTable getSearchTable(){
// view class
return searchTable;
}
我在控制器类中创建了"ListTableModel",并遵循Camick的教程。
private Product_View productView;
private Product_Model productModel;
private Product product;
public Product_Controller(Product_Model model, Product_View view){
this.productModel = model;
this.productView = view;
view.addSaveListener(new SaveListener());
view.addCloseListener(new CloseListener());
view.addSearchSingleListener(new SearchListener());
}
public void displayProductView(){
this.productView.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.productView.setVisible(true);
} class SearchListener implements ActionListener {
public SearchListener() {
}
@Override
public void actionPerformed(ActionEvent ae) {
ListTableModel model = null;
String prodName = productView.getProductName();
JTable tempTable = productView.getSearchTable();
model = productModel.getProduct(prodName, model);
tempTable = new JTable(model);
}
}
最后,方法"getProduct"在模型类中,由我的控制器类调用。
public ListTableModel getProduct(String productName, ListTableModel model){
String query = "SELECT * FROM Products WHERE name='" + productName + "';";
Statement stmt;
try {
stmt = this.conn.createStatement();
stmt.executeQuery (query);
ResultSet rs = stmt.getResultSet();
writeResultSet(rs);
model = ListTableModel.createModelFromResultSet(rs);
rs.close ();
stmt.close ();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return model;
}
Jtable不返回任何内容,我如何查看我的ResultSet数据(我已经将"writeResultSet"返回的值打印到控制台,因此查询工作正常?
创建表不会将表添加到GUI中。在你的代码中,你需要像这样的代码
frame.add( table );
如果你正在更新一个现有的表,那么你不会创建一个新的表,你所做的只是:
table.setModel(...);
在重新创建模型之后。
编辑:
要测试SQL,请创建一个简单的SSCCE,代码如下:
ListTableModel model = ListTableModel.createModelFromResultSet( resultSet );
JTable table = new JTable( model );
frame.add( new JScrollPane( table ) );
frame.setSize(...);
frame.setVisible( true );