【问题标题】:Java table model designJava表模型设计
【发布时间】:2008-10-03 13:55:19
【问题描述】:

我有一个创建修改项目表的表类。我想使用表格模型在 JTable 中显示这些项目。对我来说,表格模型属于我的 GUI 包,但表格需要表格模型才能触发更改,表格模型需要表格类才能显示它,所以我不能将两者分开。如果您需要这样做,您使用的类结构是什么?还是我的思想有一个流动,它们属于同一个包?

【问题讨论】:

    标签: java model


    【解决方案1】:

    TableModel 是一个适配器。我总是将表模型编写为扩展AbstractTableModel,并将其作为我的 GUI 面板类的私有内部类。您只需填写几个方法:getRowCountgetColumnCountgetValueAt

    您的 GUI 类应该可以访问一些 控制器,它可以从中填写这些信息。当您的控制器发现数据更新时,它应该通知您的 GUI 类,然后该类可以调用 AbstractTableModel.fireTableDataChanged 或其他适当的方法。

    永远不要使用DefaultTableModel 类,因为这样您就必须使表模型的数据与控制器的数据保持同步。正如我所说,表模型是一个适配器,它以JTable 可以理解的方式呈现控制器的数据

    【讨论】:

    • 嗯,你的意思是必须实现的方法是
       public int getRowCount();公共 int getColumnCount(); public Object getValueAt(int row, int column); 
      不是吗?
    • 哈哈是的。哎呀!应该先检查一下!
    【解决方案2】:

    对我来说,tablemodel 是小部件的一部分,即 GUI。我不会依赖我的业务逻辑类中的 javax.swing 包。

    因此,您将使用适配器或其他机制从业务层加载您的表模型,但这种分离程度可能很有用。

    决定还取决于项目的规模,而且可能比这复杂得多。例如。有关更抽象的案例,请参阅 jgoodies binding 框架和文档。

    【讨论】:

      【解决方案3】:

      模型是保存数据的位。它应该像此类模型一样维护和触发侦听器。

      现在您可能需要模型中的某种委托来转换数据或调整类型。因此,您将数据保存在与 javax.swing.table 无关的模型对象中。然后实现一个 TableModel 委托给你的底层模型。使用该 TableModel 创建一个 JTable,但不引用底层模型。

      【讨论】:

        【解决方案4】:

        我强烈建议任何从事重要表格或列表驱动开发的人看看Glazed Lists - 我已经编写自定义 TableModel 和 CellRenderers 多年,与 JGoodies 绑定等...我大约一年前偶然发现了 GL ,而我的发展从未如此 - Glazed Lists 方法令人震惊。

        GL 有两个特点,使其成为基于列表的数据绑定和处理的首选框架:

        1. 非常非常容易做你想做的正常事情
        2. 让您可以做您可能想做的非常非常困难的事情

        看一看,看看你是否没有留下深刻的印象。我强烈建议您先玩一下示例应用程序,然后再观看一些带您完成实际编码过程的屏幕截图。

        【讨论】:

          【解决方案5】:

          表模型不需要知道它放入的表的任何信息。我​​将表模型放在模型包中,将表放在视图包中。控制器负责向模型包询问模型,向视图包询问表格,并在表格中设置该模型。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多