如何确保JDialog始终保持在最前端

7
我有一个JDialog,需要用户输入名称。在JDialog后面是一个applet,我不希望用户在输入名称之前访问该applet。我尝试使用JDialog.setAlwaysOnTop(true),但是applet会抛出AccessException错误。所以我通过保持while循环来执行JDialog.setVisible(true),直到JtextField(用户名称输入)为空("")。但由于某些原因,这种方法非常缓慢,即JDialog加载很慢,而且需要时间才能聚焦于JTextField,即使用户键入名称,也会非常缓慢...大约每2秒钟输入一个字符...是否有其他方法可以强制用户在访问applet之前输入名称?
3个回答

12

使用模态JDialog。例如,您的JApplet的init(...)方法中的代码可能包括:

JDialog dialog = new JDialog(SwingUtilities.windowForComponent(this));
dialog.setModal(true);
dialog.setSize(...);
dialog.setVisible( true );

或者您可以直接使用JOptionPane.showInputDialog()。同样,您只需将“this”作为选项面板的父组件指定即可。


但是有一个问题。ActionListeners不再响应。而且,用户可以关闭对话框(对话框右上角有一个x)。在用户输入名称后,我需要恢复什么吗? - mithun1538
如果您不希望用户能够关闭对话框,则使用以下代码:dialog.setDefaultCloseOperation(...); - camickr

3
另一个选择是:
frame.setAlwaysOnTop(true);

它将对话框强制置于其他所有对象的最上层。


0
它运行缓慢是因为程序正在处理那个foo循环。
你可以做的是添加一个窗口监听器,然后当jdialog失去焦点(或者applet获得焦点)时,将焦点返回到jdialog。
这比你现在使用的for循环要快得多。

如果ModalityTypes适用于小程序,我建议使用它。不过我现在没有时间去找出来。 - Michael Myers
我在JDialog中添加了一个FocusListener,并编写了focusLost()函数的主体。然而,它似乎不起作用。如果用户在JDialog外单击,它不会再次显示。我认为在JDialog外单击并不会导致JDialog失去焦点,只是被隐藏了。 - mithun1538

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接