2

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

在我正在做的应用程序中,我有几个 JTextField。字段中的数据集来自 JTable。我的控制器中有一个ListSelectionListener添加到该JTable(在视图中),以便在选择更改后,所选行的数据将被反射到相应的Textfields

    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的模型中传递数据。

4

1 回答 1

2

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

如果您选择取代编辑JTable本身, aListSelectionListener是更新您的(匿名)依赖视图的正确方法,例如SelectedRow. 你的控制器应该没什么可做的,除了添加SelectedRow一个监听器到你的JTable. 由于SelectedRow包含(可能)可编辑字段,您需要负责几件事:

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

  • 在这里提到的视图和模型坐标之间的转换。

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

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

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

于 2013-04-07T20:34:04.497 回答