首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新JTable视图

如何更新JTable视图
EN

Stack Overflow用户
提问于 2014-08-03 09:33:20
回答 1查看 357关注 0票数 0

我有一个小应用程序项目,涉及到JDBC和MySQL数据库。我试图坚持MVC架构,同时使之成为主流,交互的主要形式是控制器。当用户根据按下的“查找”按钮搜索数据库时,它将创建一个新的JTable视图来显示搜索结果:

代码语言:javascript
复制
model = DbUtils.resultSetToTableModel( results );
view = new Tunes_Peddler_View( model );

但是,如果我再次按Find按钮,就会创建JTable的一个新实例,而我希望现有窗口使用新查询的结果进行更新。

下面是从结果对象创建表模型的DbUtils类的代码:

代码语言:javascript
复制
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

以及创建实际视图本身的代码:

代码语言:javascript
复制
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视图只是更新而不是创建一个新视图,我是应该向它添加一个侦听器,还是应该如何进行呢?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-03 21:16:03

不要创建视图的新实例,而是在控制器中维护对视图的单个引用,当您获得新模型时,将其传递给视图的实例,并允许视图设置表的模型。

这是MVC应该如何工作的核心。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25103373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档