【发布时间】: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 受阻的经典描述...