JTable中显示字段的不良变化

时间:2013-08-19 22:44:05

标签: java swing model jtable

目前我有一个允许我在Jtable中显示数据的应用程序,然后当我双击Jtable时,打开一个小窗口只编辑3个字段,注释,到期日期和描述。我更新了这个值(whit preparedStatement),每当我对数据库进行更新时,我的表只是刷新自己,用我刚刚在其他窗口中插入的新值更改dateFormat但格式不同!这怎么可能?

我不理解这一点,因为当我按下包含以下代码的“搜索”按钮时,我只在表格中设置了一个模型:

ArrayList<FiltrosResumen> filtrosResumenList = MainFrame.dataBase.searchFiltroResumen(query);
        FiltrosResumenTableModel resumenModel = new FiltrosResumenTableModel(filtrosResumenList);
        this.resumenTable.setModel(resumenModel);
        hideColumns(1);

SS

我正在使用包含所有表字段的自定义表模型,所以首先你可以看到我将数据库中的所有行从自定义对象“FiltrosResumen”中收集到一个ArrayList中,然后我传递了这个来自我的customTable模型“FiltrosResumenTableModel”的构造函数,它扩展了AbstractTableMode我没有使用任何特殊渲染,最重要的方法是

public Object getValueAt(int rowIndex, int columnIndex) {
        switch (columnIndex) {
            case 0:
                return this.filtrosResumen.get(rowIndex).getIdFiltro();
            //....
            //case 9:
           default:
                return null;
        }
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        FiltrosResumen filtroResumen = new FiltrosResumen();
        switch (columnIndex) {
            case 0:
                filtroResumen = this.filtrosResumen.get(rowIndex);
                filtroResumen.setIdFiltro(Long.parseLong(aValue.toString()));
                this.fireTableCellUpdated(rowIndex, columnIndex);
                break;}
             //....
            //case 9: 

            }

构造函数

  public FiltrosResumenTableModel(List<FiltrosResumen> filtrosResumen) {
        this.filtrosResumen = filtrosResumen;

    }

正如我之前所说,数据库不直接与表交互,因为将查询结果存储在ArrayList中,然后将其发送到我的customTableModel的构造函数。

编辑:为了更改其中一个行的值,我以这种方式发送FiltrosResumen对象:

FiltrosResumenTableModel modelo = (FiltrosResumenTableModel) this.resumenTable.getModel();
resumen = modelo.getResumen(row);
EditResumenIF editConexionesIF = new EditResumenIF(resumen);

编辑:将resumen对象传递给InternalFrame构造函数(EditResumenIF)。在这个新的InternalFrame(EditResumenIF)中,我将值分配给JCalendar和JTextField以更改值,然后保存他们。构造函数接收到的同一个对象执行查询然后返回一个字符串,(如果字符串为空,则表示查询成功且没有任何错误)

String error = MainFrame.dataBase.updateResumen(resumen, resumen.getIdFiltro());

我的表怎么知道价值变了?

1 个答案:

答案 0 :(得分:3)

类型为Object.class的单元格的默认renderer是“显示对象字符串值的标签。”除非您执行TableModel覆盖getColumnClass()以返回其他值,否则您的结果不会出乎意料。您可以使用DefaultTableModel将此example与您的实施进行比较。

附录:我的表如何知道值已更改?

JTableTableModelListener;对模型的任何更改都应该(或应该)传播到表中。如果没有complete example,我猜您正在使用第二个表table2来编辑从原始table1获得的某些数据的副本。

  • 确认您正在复制getResumen()中的数据,而不仅仅是复制对table1模型的引用。

  • setValueAt()的{​​{1}}中TableModel的实施中,更新table2的模型。具体机制取决于您的table1;两种方法形成对比here

附录:我没有使用另一张桌子...我正在传递对我内部框架的引用

同样的原则也适用。作为直接耦合模型的替代方法,让表格的模型为内部框架TableModel,如图here所示。