最小化/最大化后,JTable重置为原始状态

时间:2016-02-03 17:31:00

标签: java swing jtable

我有一个Swing屏幕,打开时带有一个充满itenms的JTable和一个空的JList。在按钮发生事件之后,我将移动 itens从JTable移动到JList,使JTable变空,JList充满了我想要的项目。但是我有一个奇怪的问题,当框架最小化然后最大化时,JTable会再次回到原始状态并再次显示所有项目。

当我从数组中删除保留JTable值的项时,不应该发生这种情况。我使用sysout在控制台上观察数据大小,因为项目正在删除,我确信最终它的大小已经变为零。

另外,我在getXXX中将断点用于检索JTable的数组值,并使用repaint()方法将自己覆盖到原始值,并且我没有任何断点暂停。

所以....我不知道它将值重置为原始状态!

最后,我发现只有在点击表格区域时才会发生这种情况,因此将JFrame更改为JDialog,其中没有最小化/最大化按钮根本无法解决问题。

我不知道某些代码是否会有所帮助,但无论如何,我只有初始化JTable的init方法。

private void initTable(Object rowData[][]) {

documents = rowData;
dataModel = new DataModel(rowData, COLUMNS);
scrollPane = new JScrollPane();
scrollPane.setBounds(13, 188, 300, 148);
contentPane.add(scrollPane);

table = new JTable(dataModel) {
    @Override
    public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) {
        super.changeSelection(rowIndex, columnIndex, true, false);
    }

};
scrollPane.setViewportView(table);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(30);
table.getColumnModel().getColumn(1).setPreferredWidth(260);
table.setCellSelectionEnabled(true);
table.setRowSelectionAllowed(false);
table.setColumnSelectionAllowed(false);
ListSelectionModel cellSelectionModel = table.getSelectionModel();
cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
    public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting()) {
            int selectedRow = table.getSelectedRow();
            int selectedColumn = table.getSelectedColumn();
            if (selectedRow >= 0) {
                if (selectedColumn == 0) {
                    Boolean valorCol= (Boolean) documents[selectedRow][0];
                    if (valorCol== true) {
                        documents[selectedRow][0] = false;
                    }
                    else {
                        documents[selectedRow][0] = true;
                    }
                }
            }
        }
        table.clearSelection();
    }
});
}

_______ EDITING _______

我删除项目的方式是由List而不是原始数组组成。在从JTable移动项目的过程之后,我调用上面的方法,但这次列表为空。这就是"缺少代码"

移动所有物品后......

Object[][] documentsMoved = buildTableDataFromList(myVO.getDocuments());
initTable(documentsMoved );

private Object[][] buildTableDataFromList(List<MyVO> list) {

    Object[][] retorno = new Object[list.size()][COLUMNS.length];
    for (int i = 0; i < list.size(); i++) {
        MyVO vo = lista.get(i);
        retorno[i][CHECK_COL] = Boolean.TRUE;
        retorno[i][DOC_COL] = vo.getFileName();
    }
    return retorno;
}

1 个答案:

答案 0 :(得分:2)

您似乎正在直接更改dataVector的{​​{1}}。这不是你应该做的事情。您应该做的是通过DataModel的接口(使用模型索引)或通过DataModel接口(使用视图索引)更改单元格值。

所以我的建议是改变你的计划去做我刚才所说的。但是,如果您坚持按照自己的方式工作,那么如果JTable扩展DataModel,那么您可以向dataVector发出基础DataModel变化的信号,我认为这样做或实施DefaultTableModel界面。更改整个模型后调用AbstractTableModel,或使用documents.fireTableDataChanged();更改单元格时更精细。

您要犯的另一个错误是混淆视图索引和模型索引。如果对行进行排序和/或在表中移动列,则这些可能会有所不同。在使用从视图返回的索引索引模型之前,您应该使用documents.fireTableCellUpdated(rowModelId,colModelId);JTable.convertRowIndexToModel转换这些视图索引。

将此应用于selectionListener:

  

你应该做什么:

JTable.convertColumnIndexToModel
  

如果你坚持按照自己的方式工作:

cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
    public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting()) {
            int selectedRow = table.getSelectedRow();
            int selectedColumn = table.getSelectedColumn();
            if (selectedRow >= 0) {
                if (table.convertColumnIndexToModel(selectedColumn) == 0) {
                    Boolean valorCol = (Boolean) table.getValueAt(selectedRow,selectedColumn);
                    if (valorCol == true) {
                        table.setValueAt(Boolean.FALSE,selectedRow,selectedColumn);
                    }
                    else {
                        table.setValueAt(Boolean.TRUE,selectedRow,selectedColumn);
                    }
                }
            }
        }
        table.clearSelection();
    }
});

唉,我认为根据您对swing和JTable的理解,您的代码可能会出现更多问题。