[英]Java Swing Threading Problem
这就是问题所在。 我有一个JDialog框,它由3个组合框,一个文本字段,一些按钮和一个JTable组成。 JTable信息是根据文本字段和组合框进行过滤的,因此,例如,它以所有数据开头,并且缩减为仅以用户决定的任何字符串值开头的数据。
但是,发生的是,尽管值正确过滤,但是如果我单击JTable(在空白处,没有行),则将显示被删除的行,就像它们在我单击它们之前是不可见的。 我已经尝试了几乎所有方法:每次尝试单击过滤器时我都尝试重新创建表(坏的技巧甚至都无效),我调用了所有的重绘,重新验证,firechanged方法,我重写了对话框从头开始,以确保我没有犯任何愚蠢的错误(如果我犯了一个错误,至少没有找到它),并且我尝试将它们放在单独的线程中。 我没有尝试过的唯一解决方法是使用Swing工作者,但这是因为我的筛选工作太复杂了,以至于我无法确定要去哪里以及如何正确扩展Swing工作者。 该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;
}
更新中,我还从下面的注释中实现了过滤器,尽管它过滤出了正确的数据,但也存在完全相同的问题。 将来我可能会使用此过滤器功能,所以谢谢。
另一个更新是,即使删除了除此块以外的所有内容,代码仍然失败,并且我在这里所做的所有操作(至少是我相信..)都是在进行简单的删除行调用。 希望这个对你有帮助。
您是否尝试过在每次要过滤时创建一个新模型,而不是通过删除行来清除它? 创建新模型,将相关行复制到新模型,在表中设置新模型。 确实没有必要,但这可能是一个快速修复。
另外,我真的想知道为什么在使用equalsIgnoreCase比较两个字符串时为什么要在两个字符串上调用toLowerCase。
只要从EDT调用此方法,我认为就不会出现线程问题。 尝试使用
SwingUtilties.isEventDispatchThread()
确保;确定。
如果您查看用于DefaultTableModel的API,更新将被发送到您的JTable,它将重新绘制自身,因此我认为这不是问题。
我猜这是一个逻辑问题。 如果可以将逻辑提取到单独的方法中,则将更容易测试和验证它是否正在按预期更新模型。
几个观察:
我认为可能发生的情况是,随着事件被触发,我看到JTable中触发了重新绘制和重新验证事件,当它们被排入EDT时,它们可能会相互踩踏。
我建议创建一个新的数据模型,添加要保留的行,然后将其重新分配给jTable1.setModel(newDm);。
同样要注意的是,当您处于事件监听器中时,是否有人在修改模型。
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.