Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从连接了行分类器的DefaultTableModel中删除行不';不要删除最后一行_Java_Swing_Jtable_Tablerowsorter - Fatal编程技术网

Java 从连接了行分类器的DefaultTableModel中删除行不';不要删除最后一行

Java 从连接了行分类器的DefaultTableModel中删除行不';不要删除最后一行,java,swing,jtable,tablerowsorter,Java,Swing,Jtable,Tablerowsorter,我对Java有点陌生,尤其是对表,我在一个特定任务上遇到了一些麻烦 我有一个JTable,它使用一个扩展DefaultTableModel的自定义表模型,并在表上附加了一个TableRowSorter。下面的示例应用程序有两个按钮——一个将把行加载到表中,另一个将从表中删除所有选定的行 出于某种原因,如果您选择表中的最后一行以及任何其他行,当您单击“删除”按钮时,它将删除除最后一行之外的所有选定行。您可以删除任何其他行的组合,效果很好 此外,如果您首先单击列标题对行进行排序(即使行的顺序没有改变

我对Java有点陌生,尤其是对表,我在一个特定任务上遇到了一些麻烦

我有一个JTable,它使用一个扩展DefaultTableModel的自定义表模型,并在表上附加了一个TableRowSorter。下面的示例应用程序有两个按钮——一个将把行加载到表中,另一个将从表中删除所有选定的行

出于某种原因,如果您选择表中的最后一行以及任何其他行,当您单击“删除”按钮时,它将删除除最后一行之外的所有选定行。您可以删除任何其他行的组合,效果很好

此外,如果您首先单击列标题对行进行排序(即使行的顺序没有改变),它也会正常工作。如果我在加载后添加一行对表中的行进行显式排序,问题就会“消失”,但我想知道为什么我所做的是不正确的

要查看行为,请单击“加载”按钮填充表,选择表中的所有行,然后单击“删除”按钮。它将删除除最后一行之外的所有行

正如对println的调用所示,循环的第一次迭代将所选行数减少了2。无论表中有多少行,此行为都是一致的,但前提是选择了表中的最后一行

我使用的是Java版本1.6.0_16。你知道我做错了什么吗

谢谢

import javax.swing.*;
导入javax.swing.table.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.Vector;
导入java.util.array;
公共类表格测试
扩展JFrame
{
私有JTable-widgetable;
私有widgetablemodel-widgetablemodel;
公共静态void main(字符串[]args)
{
TableTest框架=新的TableTest();
框架。设置尺寸(600400);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共表格测试()
{
此.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
invokeLater(new Runnable(){public void run(){createUI();}});
}
私有void createUI()
{
此.setLayout(新的BorderLayout());
JButton loadButton=新JButton(“加载”);
loadButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
loadPerformed();
}
});
添加(加载按钮,BorderLayout.NORTH);
widgetTableModel=新的widgetTableModel();
widgetTable=新的JTable(widgetTableModel);
setRowSorter(新的TableRowSorter(WidgeTableModel));
add(新的JScrollPane(widgetable),BorderLayout.CENTER);
JButton removeButton=新JButton(“删除”);
removeButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
removePerformed();
}
});
添加(移除按钮,BorderLayout.SOUTH);
}
私有void loadPerformed()
{
addRow(新对象[]{“小部件1”});
addRow(新对象[]{“小部件2”});
addRow(新对象[]{“小部件3”});
addRow(新对象[]{“小部件4”});
addRow(新对象[]{“小部件5”});
}
私有void removePerformed()
{
int-selectedRow=widgetable.getSelectedRow();
while(selectedRow>=0){
System.out.println(“selectedRowCount=“+widgetable.getSelectedRowCount());
int modelRow=widgetable.convertRowIndexToModel(selectedRow);
WidgeTableModel.removeRow(modelRow);
selectedRow=widgetable.getSelectedRow();
}
}
}
类WidgeTableModel
扩展DefaultTableModel
{
公共WidgetTableModel()
{
本附录第1栏(“第1栏”);
}
}
将“while”改为“if”。选择所有行,然后单击按钮。由于某种原因,最后一行失去了选择。我不知道为什么


我发现删除逻辑通常应该从最后一行一直执行到0。这样,您就不必担心行索引值在删除行时会发生变化。因此,您需要使用getSelectedRows()方法,并以相反的顺序遍历数组。尽管如此,我必须承认我从未在排序表上这样做过,所以我不确定它是否会导致问题。

在java.net上也讨论过:

它位于核心DefaultRowSorter中:其基础(如报告中所述)是getModelRowCount()的一个定义不太好的语义。它已在SwingX DefaultSortController中修复

/** 
 * Additionally, this implementation contains a fix for core 
 * <a href=http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6894632>Issue 6894632</a>.
 * It guarantees to only touch the underlying model during sort/filter and during 
 * processing the notification methods. This implies that the conversion and size query
 * methods are valid at all times outside the internal updates, including the critical 
 * period (in core with undefined behaviour) after the underlying model has changed and 
 * before this sorter has been notified.
 */
/**
*此外,此实现还包含对core的修复
* .
*它保证在排序/筛选期间和
*处理通知方法。这意味着转换和大小查询
*方法在内部更新之外始终有效,包括关键更新
*基础模型更改后的期间(在核心中,行为未定义),以及
*在通知该分拣机之前。
*/

不幸的是,SwingLabs论坛中包含完整分析(was:)的线程在项目迁移后不再可用

按相反顺序迭代选定的行应该可以工作,但似乎没有必要。该示例现在的工作方式应该同样可靠——始终获取表中选定的第一行。这也消除了跟踪索引更改的需要。问题似乎是导致最后一行被取消选择的“bug”(或任何源代码)。
/** 
 * Additionally, this implementation contains a fix for core 
 * <a href=http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6894632>Issue 6894632</a>.
 * It guarantees to only touch the underlying model during sort/filter and during 
 * processing the notification methods. This implies that the conversion and size query
 * methods are valid at all times outside the internal updates, including the critical 
 * period (in core with undefined behaviour) after the underlying model has changed and 
 * before this sorter has been notified.
 */