我有一个Swing屏幕,打开时带有一个充满itenms的JTable和一个空的JList。在按钮发生事件之后,我将
当我从数组中删除保留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;
}
答案 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的理解,您的代码可能会出现更多问题。