【问题标题】:Swing MVC - Data in ModelSwing MVC - 模型中的数据
【发布时间】:2013-04-07 10:22:04
【问题描述】:

我开始学习如何在 Swing 中实现 MVC 模式。我对模型中的数据感到困惑。

在我正在做的应用程序中,我有几个 JTextField。字段中的数据集来自 JTable。我在我的Controller中添加了ListSelectionListener添加到该jtable(在视图中),以便在选择发生更改时,来自所选行的数据将反映在相应的文本字段

    public void transferTableDataToFields(){
        if(tblProduct.getSelectedRows().length != 0){
            int selRow = tblProduct.getSelectedRow();
            txtID.setText(tblProduct.getValueAt(selRow, 0).toString());
            txtName.setText(tblProduct.getValueAt(selRow, 1).toString());
            txtDescIn.setText(tblProduct.getValueAt(selRow, 2).toString());
            txtSupplier.setText(tblProduct.getValueAt(selRow, 4).toString());
            txtPrice.setText(tblProduct.getValueAt(selRow, 5).toString());
        }
    }

我的问题是,我做对了吗?我是否应该在模型中定义与视图中的文本字段相对应的字段,然后将代码更改为控制器,将模型的字段设置为视图 jtable 中的值,然后让模型向其侦听器触发属性更改通知,然后让侦听器调用基于属性更改事件的视图中的更新方法?

我对这种方法的问题是,视图应该有一个方法可以返回从 jtable 中选择的行,我觉得这有点难看。

编辑

@trashgod 这就是我要说的。

在我的 TableModel 实现中,在这里填充数据更好吗?

public MyTableModel extends AbstractTableModel{
   List<Row> data;
   Row header;

   public MyTableModel(){
      initializeData();
   }   

   public void initializeData{
      //query database here then put it in the list
   }
   //other methods to implement e.g. getvalueAt(int x, inty){data.get(x).get(y);}
}

如果我这样做会更好吗?因为目前我在我的主模型中存储并填充了我的表的数据(还包含在SelectedRow 视图中具有相应文本字段的字段)然后我在我的JTable 的模型中传递数据。

【问题讨论】:

  • 我认为 XxxTableModel 可以成为 ....
  • 你能澄清你的答案吗?

标签: java swing model-view-controller jtable jtextfield


【解决方案1】:

在这种情况下,当前选择是视图的属性,JTable 的实例,不是模型,TableModel 的实现。

如果您选择在 JTable 本身中取代 editingListSelectionListener 是更新(匿名)依赖视图的正确方法,例如SelectedRow。除了将SelectedRow 添加为JTable 的侦听器之外,您的控制器应该没什么可做的。由于SelectedRow 包含(大概)可编辑字段,您需要负责几件事:

  • 将任何更改传播回原始表的TableModel,通常通过setValueAt()

  • 在视图和模型坐标之间转换,提到了here

  • 在源JTable 中排除(或通过ListSelectionListener 同步)编辑。

附录:在我的内部TableModel实现,在这里填充数据更好吗?

答案取决于应用程序。您的 TableModel 实现应该公开一个公共 API,该 API 提供尽可能多(或尽可能少)的 API,以支持应用程序对并发和延迟的要求。作为参考,DefaultTableModel 是一个通用示例,尽管您可能希望在内部使用比Vector 更新的东西。

【讨论】:

  • 感谢您花时间回答我的问题,但我不确定我是否完全理解您。好吧,首先,你说我的 jtable 中的选定索引应该是我视图的属性。 ListSelectionListener 是什么意思是更新我的(匿名)依赖视图的正确方法,例如SelectedRow?
  • 澄清:您有两个视图共享来自同一模型的数据。一个视图是具有当前选择的JTable;另一个是具有多个JTextField 实例的未命名视图。我使用标识符SelectedRow 来引用那个未命名的视图。 SelectedRow 使用 ListSelectionListener 监听 JTable 的当前选择。如果您仍然遇到问题,请编辑您的问题以包含使用您喜欢的标识符的sscce
  • 我现在明白了,这正是我正在经历的。 1 个模型,2 个视图。等等,在您的第一段中,您是否还说我的视图也应该为我的 JTable 实例提供一个 getter?
  • SelectedRow 需要引用其父 JTable 以便它可以访问 TableModel 并在视图和模型坐标之间进行转换。
  • 是的,数据进入TableModel。不,一个TableModel 就足够了。
猜你喜欢
  • 2016-10-11
  • 1970-01-01
  • 2018-02-25
  • 2011-07-10
  • 2010-10-03
  • 2012-11-17
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多