Java-JTable-getSelectedRow()中的数据错误
我到处寻找,所以这是我最后的希望 我有一个JTable,其中填充了一些CSV值。当我执行删除选定行的操作时,它不会删除所有。。。要更好地理解,请执行调试:Java-JTable-getSelectedRow()中的数据错误,java,swing,jtable,Java,Swing,Jtable,我到处寻找,所以这是我最后的希望 我有一个JTable,其中填充了一些CSV值。当我执行删除选定行的操作时,它不会删除所有。。。要更好地理解,请执行调试: Begin (total selected): 6 Removed index: 6 Removed index: 4 Removed index: 3 Removed index: 2 Removed index: 1 End (total selected): 0 但剩下的是。。。。请注意,其中5个已删除,但有一个已跳过。。。我不明白为
Begin (total selected): 6
Removed index: 6
Removed index: 4
Removed index: 3
Removed index: 2
Removed index: 1
End (total selected): 0
但剩下的是。。。。请注意,其中5个已删除,但有一个已跳过。。。我不明白为什么会这样
我的代码:
// I got a List<LikedHashMap<String, String>> data
// where I store my CSV data.
// To populate the JTable I remove from this list (data)
// and insert to JTable.
// Before remove from JTable, I put back the row into data.
// THIS LOOP IS WORKING PRETTY WELL.
for (int row : this.table.getSelectedRows()) {
// Vamos recolocar esta linha na lista de não selecionados
LinkedHashMap<String, String> newRow = new LinkedHashMap<>();
// Vamos pegar todos os dados da linha
for (int c = 0; c < this.headerCols.size(); c++) {
newRow.put(
this.headerCols.get(c),
(String) this.tableModel.getValueAt(row, c)
);
}
// Adiciona aos nao selecionados
if (!this.data.contains(newRow)) {
this.data.add(newRow);
}
}
/**
* MY PROBLEM ACTUALLY BEGINS HERE...
*/
System.out.println("Begin (total selected): "+String.valueOf(this.table.getSelectedRowCount()));
// Remove da tabela.
while(this.table.getSelectedRow() != -1) {
System.out.println("Removed item: "+String.valueOf(this.table.getSelectedRowCount()));
this.tableModel.removeRow(this.table.getSelectedRow());
}
System.out.println("End (total selected): "+String.valueOf(this.table.getSelectedRowCount()));
非常感谢你们,伙计们 您错误地使用视图索引为模型编制索引。代码中的问题:
for
内部循环应该如下所示:您可以从顶部的介绍中了解更多有关视图索引与模型索引的信息。一些相关引用: JTable专门使用整数来引用它显示的模型的行和列。JTable只是获取一个表格范围的单元格,并在绘制期间使用getValueAt(int,int)从模型中检索值重要的是要记住,各种JTable方法返回的列索引和行索引是根据JTable(视图)的,不一定与模型使用的索引相同。 默认情况下,可以在JTable中重新排列列,以便视图的列以与模型中的列不同的顺序显示。这根本不会影响模型的实现:当列被重新排序时,JTable在内部维护列的新顺序,并在查询模型之前转换其列索引 […]下面显示了如何将坐标从JTable转换为基础模型的坐标:
int[]selection=table.getSelectedRows();
for(int i=0;i
不久前,我回答了一个类似的问题。这种情况处理的是不正确的列索引而不是行索引,但问题是类似的。是你的朋友
所有基于JTables行的方法都是以RowSorter为基础的,它不一定与底层TableModel相同。例如,选择总是以JTable为单位,因此在使用RowSorter时,您需要使用convertRowIndexToView或convertRowIndexToModel进行转换
根据jTable.getSelectedRow()
返回第一个选定的行索引。对于第一个循环,一切都很好。但一旦删除了该行,其余的行将在删除一行后获得新索引。因此,对于删除一行后剩余的其他行,现在的行索引将不同
未排序的调试报告是因为在您正在试验的选定行之间有一行未选中。谢谢您的回答,这非常有意义!所以我尝试了这个代码但没有成功。。。int行;而((row=this.table.getSelectedRow())!=-1{this.tableModel.removeRow(this.table.convertRowIndexToView(row));}=/table是视图,
tableModel
是模型。所以在这里你想使用convertRowIndexToModel(row)
。谢谢你,伙计,我得到了它,刚刚做了这个更正,但这根本不是问题所在。。。如果我对这段代码进行注释,关于删除行没有任何更改=/@那你就不明白我给你的代码之后我写的东西了。如果从模型中删除,则需要使用convertRowIndexToModel
将从JTable.getSelectedRow
获取的视图索引转换为模型索引。@MarcoA.Braghim我更新了我的答案,以强调关于视图索引与模型索引的第二个问题。我希望你仔细阅读我给你的额外信息,这样你就不会再犯这样的错误了。PS:this.在每次方法调用之前都有。是不必要的,读得太快会让人厌烦。@MarcoA.Braghim我不是在浪费时间,我很乐意帮助和教育人们。不要从桥上跳下去,这不值得!有时候最好退一步,花点时间放松一下,开始以一种新的精神来看待你的问题。不过,总的来说,如果您不制作自定义JTable控件,而只是使用它来显示数据,那么扩展JTable通常是个坏主意。@MarcoA.Braghim哦,是的,使用线程与UI组件交互是个坏主意。与UI组件的交互需要与UI线程(在Java术语中也称为)同步。Swing对象不是线程安全的,因此从其他线程与它们交互将导致大问题。与其他线程中的Swing组件的交互是使用Well完成的,你说得对,伙计。我使用它:while(this.table.getSelectedRow()!=-1){/…}已经不工作了…=/谢谢你的回答,如果我还没有得到它,很抱歉…给定一个DefaultTableModel
,使用setRowCount(0)
,因为@trashgod他只想删除选中的行,而不是所有的行。啊,所有选中的行;知道了!
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index
at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:514)
at javax.swing.JTable.convertRowIndexToModel(JTable.java:2642)
at javax.swing.JTable.getValueAt(JTable.java:2717)
at javax.swing.JTable.prepareRenderer(JTable.java:5706)
at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:683)
at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:580)
at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:364)
at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:275)
at javax.swing.JComponent.paintComponent(JComponent.java:780)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290)
at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
at javax.swing.JComponent._paintImmediately(JComponent.java:5167)
at javax.swing.JComponent.paintImmediately(JComponent.java:4978)
at javax.swing.RepaintManager$4.run(RepaintManager.java:824)
at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
int rowModelId = convertRowIndexToModel( row );
for (int c = 0; c < headerCols.size(); c++) {
newRow.put(
headerCols.get(c),
(String) tableModel.getValueAt(rowModelId, c)
);
}
while(table.getSelectedRow() != -1) {
int rowModelId = convertRowIndexToModel( table.getSelectedRow() );
System.out.println("Removed item: "+String.valueOf(this.table.getSelectedRowCount()));
tableModel.removeRow(rowModelId);
}
int[] selection = table.getSelectedRows();
for (int i = 0; i < selection.length; i++) {
selection[i] = table.convertRowIndexToModel(selection[i]);
}
// selection is now in terms of the underlying TableModel