Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable的TableModelListener是如何工作的?_Java_Swing_Model View Controller_Jtable_Listener - Fatal编程技术网

Java JTable的TableModelListener是如何工作的?

Java JTable的TableModelListener是如何工作的?,java,swing,model-view-controller,jtable,listener,Java,Swing,Model View Controller,Jtable,Listener,这是我第一次使用JTable。我通过DAO模式从数据库中提取数据,将其保存在一个集合中,读取该集合并用它填充我的JTable。但是,我也在使用MVC模式,不知道如何正确更新视图,因此添加到JTable的数据实际上会显示出来。我读过关于通过观察者或TableModelListener实现的方法(我不打算讨论使用哪种方法)。但我找不到一个完整的实现,也找不到对工作中的TableModelListener的深入解释,Oracle文档对我从来没有太大帮助 有人能告诉我如何正确地实现TableModelL

这是我第一次使用JTable。我通过DAO模式从数据库中提取数据,将其保存在一个集合中,读取该集合并用它填充我的JTable。但是,我也在使用MVC模式,不知道如何正确更新视图,因此添加到JTable的数据实际上会显示出来。我读过关于通过观察者或TableModelListener实现的方法(我不打算讨论使用哪种方法)。但我找不到一个完整的实现,也找不到对工作中的TableModelListener的深入解释,Oracle文档对我从来没有太大帮助

有人能告诉我如何正确地实现TableModelListener,以便在所有数据写入JTable后更新视图吗

以下是我的AbstractTableModel类:

    public class AbstractTableModel extends DefaultTableModel{

    /**
     * 
     */
    private static final long serialVersionUID = -7354466553311529134L;

    private static Logger logger =     Logger.getLogger(AbstractTableModel.class);

    private static String col[] = { "Table", "UpdateCols", "AlterAuth",
            "DeleteAuth", "IndexAuth", "InsertAuth", "SelectAuth",     "UpdateAuth" };

    private static DefaultTableModel tableModel = new     DefaultTableModel(null, col);
    private static JTable table = new JTable(tableModel);

    public static JTable updateTable(DatenbankDaoImpl db) throws     SQLException, IOException {

        table.getModel().addTableModelListener(new TableModelListener() {

            public void tableChanged(TableModelEvent e) {
                logger.debug(e);
            }
        });

        while (table.getRowCount() > 0) {
            ((DefaultTableModel) table.getModel()).removeRow(0);
        }

        for (DatenbankBean db1 : db.getDatenbank()) {
            String table = db1.getTable();
            String updatecols = db1.getUpdatecols();
            String alterauth = db1.getAlterauth();
            String deleteauth = db1.getDeleteauth();
            String indexauth = db1.getIndexauth();
            String insertauth = db1.getInsertauth();
            String selectauth = db1.getSelectauth();
            String updateauth = db1.getUpdateauth();

            Object[] data = {table, updatecols, alterauth, deleteauth,     indexauth, insertauth, selectauth, updateauth};
            tableModel.addRow(data);
            logger.debug("AbstractTableModel: " + data.toString());
        }
//      table.repaint();
        return table;
    }

}

那么这篇文章呢?它解释了它的每一部分,并且也是可执行的

以下是基本部分:

实例化后,每个JTable对象都会被传递一个表模型对象,该对象管理它所显示的数据。默认情况下,如果未指定自定义TableModel对象,JTable对象将继承DefaultTable对象,但默认情况下,此模型仅管理字符串。要处理对象、执行计算或从数据库或其他程序检索数据,必须设计自己的自定义TableModel对象,该对象实现TableModel接口。有关详细信息,请参见创建表模型


要检测由表模型对象管理的数据的更改,JTable类需要实现TableModelListener接口,调用addTableModelListener()捕获事件,然后重写tableChanged()以响应侦听器事件。有关详细信息,请参见侦听数据更改

JTable
(视图)、
TableModel
(模型)和
tablemodelistener
(观察者)之间存在关系。基本上,
TableModel
负责根据对模型所做的更改生成适当的
tablemodeleevent
s。在大多数情况下,您不太可能需要自己实现
TableModelListener
,因为当您将
TableModel
应用于
JTable
时,
JTable
会自动向其注册
TableModelListener
(并根据模型更新自身).AbstractTableModel提供了许多辅助方法,使得基于模型的公共功能(添加/删除/更新行)生成模型事件变得容易。通常情况下,这是您进行交互的地方,“但我找不到一个完整的实现或对工作的TableModelListener的深入解释”-
AbstractTableModel
JTable
将是最好的起点“Oracle文档从未对我有过太多帮助”。这真的很悲哀,特别是如果你打算继续用Java编程的话。
因此添加到JTable的数据实际上显示了
——这就是问题所在。不向表中添加数据。将数据添加到TableModel。然后,模型会自动告诉表格自己绘制。“鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接的最相关部分,以防无法访问目标站点或永久脱机。”-听起来更像是对meI的评论——不要认为oracle会从他们的网站上删除基本教程,只要他们在销售它。因为Java现在是开源的,oracle从来没有“销售”过它,我不会在这一点上屏住呼吸——他们现在在销售它;)我已经看到了,但它并没有告诉我太多。