所以这就是问题所在。我有一个JDialog框,包含3个组合框,一个文本字段,几个按钮和一个JTable。 JTable信息基于文本字段和组合框进行过滤,因此例如它以所有数据开始,并且仅缩小为以用户决定的任何字符串值开头的数据。
正在发生的事情是,当值过滤正确时,如果我单击JTable(在空白区域,没有行),则删除的行会显示出来,就像它们在我点击它们之前一样不可见。我已经尝试了几乎一切: 我已经尝试每次点击过滤器时重新创建表(坏的黑客甚至没有工作),我已经调用了所有的重绘,重新验证,firechanged方法,我从头开始重写对话框,以确保我没有不做任何愚蠢的错误(如果我做了一个我至少没找到它),我已经尝试将它们放在不同的线程上。我没有尝试的唯一修复是使用摇摆工作者,但这是因为我的过滤有点太复杂,我无法弄清楚究竟是什么以及如何正确扩展摇摆工作者。 GUI由netbeans(bleh)生成,并且在我的其他十几个JDialogs中工作得很好(完全实际上)。这是进行过滤的方法,如果您有任何帮助,我们将非常感激。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
nameFilter = "task1";
javax.swing.table.DefaultTableModel dm = (javax.swing.table.DefaultTableModel)jTable1.getModel();
tempParameters = parameters;
String currentString;
int rowNumber = 0;
while (dm.getRowCount()>rowNumber){
currentString = (String)(jTable1.getValueAt(rowNumber,1));
if(!nameFilter.equalsIgnoreCase(currentString.substring(0,nameFilter.length()))){
dm.removeRow(rowNumber);
parameters--;
}
else rowNumber++;
}
parameters = numOfRows;
}
更新,我还从下面的评论中实现了过滤器,虽然它过滤掉了正确的数据,但它有完全相同的问题。将来我可能会使用这个过滤器功能,谢谢。
另一个更新,代码仍然失败,即使删除除了这个块之外的所有内容,所有(至少我相信..)我在这里做的是做一个简单的删除行调用。希望这有点帮助。
答案 0 :(得分:0)
您是否尝试过每次要过滤时创建新模型,而不是通过删除行来清除它?创建新模型,将相关行复制到新模型,在表中设置新模型。真的不应该是必要的,但它可能是一个快速修复。
另外,当你使用equalsIgnoreCase来比较它们时,我真的不禁要问你为什么要在两个字符串上调用ofLowerCase。
答案 1 :(得分:0)
只要从EDT调用此方法,我认为不存在线程问题。尝试使用
SwingUtilties.isEventDispatchThread()
确保。
如果您查看DefaultTableModel的API,则会向您的JTable发送更新,这些更新将重新绘制,因此我认为这不是问题所在。
我猜这是一个逻辑问题。如果您可以将逻辑提取到单独的方法中,那么测试和验证它是否正在按预期更新模型将更容易。
答案 2 :(得分:0)
观察结果:
我认为可能发生的事情是,当事件被触发时,我看到在JTable中发生了重绘和重新验证事件,这些事件在EDT中排队时可能会互相践踏。
我建议创建一个新的数据模型,添加要保留的行,然后将其重新分配给jTable1.setModel(newDm);
另外要注意的是,当您在事件监视器中时,是否有其他人正在修改模型。
希望这有帮助