gpt4 book ai didi

java - Swing MVC - 模型中的数据

转载 作者:行者123 更新时间:2023-11-30 09:23:53 24 4
gpt4 key购买 nike

我开始学习如何在 swing 中实现 MVC 模式。当涉及到模型中的数据时,我感到困惑。

在我正在做的应用程序中,我有几个 JTextField。字段中的数据集来自 JTable。我的 Controller 中有一个 listSelectionListener 添加到该jtable(在 View 中),以便在选择更改后,所选行的数据将反射(reflect)到相应的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());
}
}

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

我对这种方法的问题是, View 应该有一个方法来返回从 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 View 中还包含具有相应文本字段的字段)然后我将数据传递到我的 JTable'模型。

最佳答案

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

如果您选择取代editingJTable 本身中,ListSelectionListener 是更新您的(匿名)依赖 View 的正确方法,例如选定行。除了将 SelectedRow 添加为 JTable 的监听器外,您的 Controller 几乎不需要做任何事情。由于 SelectedRow 包含(大概)可编辑的字段,您需要负责几件事:

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

  • View 和模型坐标之间的转换,提到here .

  • 阻止(或通过 ListSelectionListener 同步)在源 JTable 中进行编辑。

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

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

关于java - Swing MVC - 模型中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15861297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com