我有一个小应用程序项目,涉及到JDBC和MySQL数据库。我试图坚持MVC架构,同时使之成为主流,交互的主要形式是控制器。当用户根据按下的“查找”按钮搜索数据库时,它将创建一个新的JTable视图来显示搜索结果:
model = DbUtils.resultSetToTableModel( results );
view = new Tunes_Peddler_View( model );但是,如果我再次按Find按钮,就会创建JTable的一个新实例,而我希望现有窗口使用新查询的结果进行更新。
下面是从结果对象创建表模型的DbUtils类的代码:
public static TableModel resultSetToTableModel(ResultSet rs)
{
try
{
//get the the metadata for number of columns and column names
ResultSetMetaData metaData = rs.getMetaData();
int numberOfColumns = metaData.getColumnCount();
Vector<String> columnNames = new Vector<String>();
// Get the column names and store in vector
for (int column = 0; column < numberOfColumns; column++)
{
columnNames.addElement(metaData.getColumnLabel(column + 1));
//NOTE: need to do the (+1) because metaData columns indexing starts at 1
//but JTable column numbering starts at 0.
}
// Get all rows data and store in a Vector.
Vector<Object> rows = new Vector<Object>();
rs.first();
do
{
Vector<Object> newRow = new Vector<Object>();
for (int i = 1; i <= numberOfColumns; i++) {
newRow.addElement(rs.getObject(i));
}
rows.addElement(newRow);
}while (rs.next());
return new DefaultTableModel(rows, columnNames);
} catch (Exception e)
{
System.out.println("Exception in DbUtils method resultSetToTableModel()...");
e.printStackTrace();
return null;
}//end catch
}//end method以及创建实际视图本身的代码:
public Tunes_Peddler_View(TableModel model)
{
// Call super.
super("Returned Records");
// Boilerplate
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1000, 200);
this.setLocationRelativeTo( null );
// Create the JTable and pass it the TableModel as an argument
JTable table = new JTable( model );
table.setModel(model );
// Create a JScrollPane to hold the JTable
JScrollPane scrollPane = new JScrollPane( table );
this.add( scrollPane );
// Last line
this.setVisible(true);
}为了使JTable视图只是更新而不是创建一个新视图,我是应该向它添加一个侦听器,还是应该如何进行呢?
谢谢。
发布于 2014-08-03 21:16:03
不要创建视图的新实例,而是在控制器中维护对视图的单个引用,当您获得新模型时,将其传递给视图的实例,并允许视图设置表的模型。
这是MVC应该如何工作的核心。
https://stackoverflow.com/questions/25103373
复制相似问题