简单问题:
摆动框架可以完全模态化(阻挡所有其他窗户)吗?
我尝试了以下操作,但我仍然可以点击其他应用程序窗口(例如此浏览器)
JDialog myDialog = ....
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
如果可能,请粘贴一些代码。
答案 0 :(得分:3)
对话并不是全局模态的。每个现代操作系统都强烈反对其HIG中的全局模态,他们甚至可能已弃用功能(正如您无法使其工作所表明的那样)。您的应用永远不会窃取整个系统中的事件;这不仅是糟糕的设计,而且在我的书中几乎是犯罪。
忽略大多数人喜欢在多个应用程序之间进行多任务的事实,打开全局模式对话框然后应用程序冻结的情况怎么样? Ctrl + Alt + Del应该可以在Windows上杀死应用程序,但我不确定Mac上的Cmd + Opt + Escape是否具有全局模态对话框(Cocoa甚至有全局模态?)。没有一个Linux平台有任何好的杀死应用程序的方法,这些应用程序已经完全控制了UI(你必须完全杀死X11并从头开始新的实例)。
我的回答:找到另一种方式。我不在乎客户要求的是什么,他们不想要这个。
答案 1 :(得分:2)
JFrame并非设计为模态。使用JDialog,但你会失去一些JFrame功能。 如果您不能忍受损失,您必须阻止EventQueue并将其替换为您自己的事件,以仅接受来自阻止事件的事件。
有关使用适用于JFrame的内部框架的说明,请参阅Creating Modal Internal Frames。
编辑: Oups,我的回答似乎有些偏差,因为您的代码示例显示您已经在使用Dialog子类。
答案 2 :(得分:1)
我不知道全局模态,但这是一个想法。
由于桌面是虚假的屏幕截图,您可以忽略任何点击它的尝试。
private void toggleFullScreenWindow() {
GraphicsEnvironment graphicsEnvironment
= GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice graphicsDevice
= graphicsEnvironment.getDefaultScreenDevice();
if(graphicsDevice.getFullScreenWindow()==null) {
dialog.dispose(); //destroy the native resources
dialog.setUndecorated(true);
dialog.setVisible(true); //rebuilding the native resources
graphicsDevice.setFullScreenWindow(dialog);
}else{
graphicsDevice.setFullScreenWindow(null);
dialog.dispose();
dialog.setUndecorated(false);
dialog.setVisible(true);
dialog.repaint();
}
requestFocusInWindow();
}