重新打开已设置 Visible(false) 的 JDialog 时 JTextField 的 java7 错误

标签 java swing

我的应用程序有一个奇怪的问题,该问题仅在 java7 中出现,而在 java6 中一切工作都完美无缺。 我有一个产品选择 JDialog,它有一个 JTable、一个确定按钮、一个取消按钮、一个用于搜索的 jtextfield 和一个 jcheckbox“保持窗口打开”。

这个想法是,如果选择“保持窗口打开”,则按“确定”按钮将不会处理 jdialog,而是将重新打开变量设置为 true,并调用 setVisible(false)。 然后我有以下代码来重新打开它:

while(SelectionDialog.isReopen()){
    Product p1 = SelectionDialog.reopen();
    if (p1 == null) return;
    //Do stuff with product
}

在选择对话框中:

public static SelectionDialog reopen = null; //Is instanciated to current jdialog if ok button is pressed and reopen-checkbox is selected. setvisible(false) is then called instead of dispose()

public static Product reopen() {
  SelectionDialog.reopen.setVisible(true);
  return SelectionDialog.returnedData;
}

奇怪的是,当 JDialog 重新显示时,jtextfield 不可聚焦/可单击。其他一切似乎都还好。如果我然后按“确定”按钮并重新打开它,则 jtextfield 再次正常,但如果我再次按“确定”按钮,它就无法再次聚焦/可点击。

jtextfield 显示文本,但不工作时没有闪烁的光标。因此,每隔一段时间 jtextfield 根本不工作,而每隔一次它又工作。

所有这些方法都为 jtextfield 返回 true:isEnabled、isEditable、isDisplayable、isVisible、isFocusable、isOpaque、isShowing、isValid。

在 jdialog 上的 setVisible(true) 之前调用 swingutilities.invokelater 中 jtextfield 上的 updateUI 并不能解决问题。 requestfocusinwindow 也没有。

唯一能让jtextfield起死回生的办法就是切换到另一个程序,然后切换回我的java程序。

我测试过,jdk1.7.0_03和1.7.0_51都存在这个问题。 我在java6及之前没有这个问题。

什么可能导致这个问题? (我已经删除了“//Do stuff with Product”中的所有内容,以防万一这做了什么,但问题仍然存在)。

即使您不知道导致问题的原因,是否有人对可能有效的解决方法有任何建议?

更新: 感谢 MadProgrammers 的评论,它现在可以使用以下代码:

SwingUtilities.invokeLater(new ReopenProductList()); //Instead of while-loop

private class ReopenProductList implements Runnable{
  public void run(){
    if (SelectionDialog.isReopen()){
      Product p1 = SelectionDialog.reopen();
      if (p1 == null) return;
      //Do stuff with product
      SwingUtilities.invokeLater(new ReopenProductList());
    }
  }
}

最佳答案

根据问题的描述,您似乎使用 while 循环 阻塞了事件调度线程。

早期测试 Java 7 时遇到过这种情况(实际上在 SwingUtiltiies.invokeLater 上陷入了死锁)。我们从未发现错误,因为我们重写了代码的整个操作(原始代码很时髦),这表明线程模型在 Java 6 和 7 之间发生了变化。

尝试从 EDT 中删除 while 循环

关于重新打开已设置 Visible(false) 的 JDialog 时 JTextField 的 java7 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21376426/

相关文章:

java - 特立尼达投票jsf

java - TestNG 中的 DataProvider 使用 Java WebDriver 从 Excel 传递数据

java - Hadoop (1.1.2) XML 处理和重写文件

java - 为什么我的java动画占用了我的整个CPU

java - GUI线程更新问题

java - 在 JTable 中对数字进行排序

java - 我可以使用java从spark UDF返回java对象吗

java - 从日历转换时sql.Timestamp 1秒错误

java - 获取应用关闭事件

java - 如何在java swing中自动扩展框架的高度