Java Swing线程问题

时间:2011-06-23 16:08:49

标签: java swing worker

所以这就是问题所在。我有一个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;
}

更新,我还从下面的评论中实现了过滤器,虽然它过滤掉了正确的数据,但它有完全相同的问题。将来我可能会使用这个过滤器功能,谢谢。

另一个更新,代码仍然失败,即使删除除了这个块之外的所有内容,所有(至少我相信..)我在这里做的是做一个简单的删除行调用。希望这有点帮助。

3 个答案:

答案 0 :(得分:0)

您是否尝试过每次要过滤时创建新模型,而不是通过删除行来清除它?创建新模型,将相关行复制到新模型,在表中设置新模型。真的不应该是必要的,但它可能是一个快速修复。

另外,当你使用equalsIgnoreCase来比较它们时,我真的不禁要问你为什么要在两个字符串上调用ofLowerCase。

答案 1 :(得分:0)

只要从EDT调用此方法,我认为不存在线程问题。尝试使用

SwingUtilties.isEventDispatchThread()

确保。

如果您查看DefaultTableModel的API,则会向您的JTable发送更新,这些更新将重新绘制,因此我认为这不是问题所在。

我猜这是一个逻辑问题。如果您可以将逻辑提取到单独的方法中,那么测试和验证它是否正在按预期更新模型将更容易。

答案 2 :(得分:0)

观察结果:

  • 如果过滤器恰好大于行的字符串内容,它将抛出子字符串调用
  • 调用dm.removerow会生成一堆tablerowsdeleted事件。
  • 您要求模型中的行数,但是通过表获取值(如果模型被另一个模型包围,您可能会对不同的行进行操作,则会有一点不一致),所以相反的jtable1.getvalueat,使用dm.getvalueat。

    我认为可能发生的事情是,当事件被触发时,我看到在JTable中发生了重绘和重新验证事件,这些事件在EDT中排队时可能会互相践踏。

    我建议创建一个新的数据模型,添加要保留的行,然后将其重新分配给jTable1.setModel(newDm);

    另外要注意的是,当您在事件监视器中时,是否有其他人正在修改模型。

    希望这有帮助