我的应用程序有一个奇怪的问题,该问题仅在 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/