【问题标题】:java7 bug with JTextField when reopening JDialog that has been setVisible(false)重新打开已 setVisible(false) 的 JDialog 时 JTextField 的 java7 错误
【发布时间】:2014-01-27 08:50:04
【问题描述】:

我的应用程序有一个奇怪的问题,它只在 java7 中表现出来,在 java6 中一切正常。 我有一个选择产品的 JDialog,它有一个 JTable、一个确定按钮、一个取消按钮、一个用于搜索的 jtextfield 和一个 jcheckbox“保持窗口打开”。

这个想法是,如果选择了“保持窗口打开”,那么按下 ok 按钮不会释放 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 不可聚焦/可点击。其他一切似乎都很好。如果我然后按下 ok 按钮并重新打开,jtextfield 再次正常,但如果我再次按下 ok,它就无法再次聚焦/可点击。

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 cmets,它现在可以使用以下代码:

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 循环很可怕。这是在 EDT 的范围内完成的吗?
  • 是的,当用户单击工具栏上的添加产品按钮时,它在事件调度线程中完成。
  • 您不应在 EDT 中执行任何可能阻止它的操作。 Java 7 加强了这一点,并突出显示了许多不良代码
  • 我不认为模态 JDialogs 是这样的,因为这些块在 setVisible(true) 上?但我可以尝试将我的代码移动到线程和/或 swingutilities.invokelater 中,看看会发生什么。
  • 说得好,但您的描述是对 EDT 受阻的经典描述...

标签: java swing


【解决方案1】:

根据问题的描述,您似乎正在使用while loop 阻塞事件调度线程。

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

尝试从 EDT 中删除 while 循环

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 2011-11-07
    • 2011-07-07
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多