cap*_*ors 4 java swing jdialog modality
我有一个生成两个JDialogs的JFrame。这三个窗口中的每个窗口都必须是可聚焦的(这是我当前编写的方式),但是JFrame不会放在对话框的顶部。当您单击任一对话框时,它们会彼此弹出(就像一个人所期望的那样),但是JFrame只是拒绝出现在最前面。
我需要它们保留JDialogs(而不是JFrames本身),因为大多数当前行为都是可取的(即,当另一个窗口/应用程序阻止任何或所有窗口时,如果选择任何窗口,它们都位于最前面) (而三个JFrame只会导致选中的一个出现)。
我的JDialogs构造函数可以达到以下效果:
SubDialog(JFrame parent /*, a handful, ofOther arguments */){
super(parent, ModalityType.MODELESS); //not even the modeless helped
setAlwaysOnTop(false); //not even the not always on top helped
setUndecorated(true); //maybe this has something to do with it (unlikely, just fyi)?
//some simple variable assignments
}
Run Code Online (Sandbox Code Playgroud)
我什至试图setAlwaysOnTop(true)在我的JFrame中扔一个。没有骰子。我感到绝望,甚至尝试了以下数字之一:
MyJFrame(String title){
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addWindowFocusListener(new WindowAdapter(){
public void windowGainedFocus(WindowEvent e){
final Window w = e.getWindow();
//PLEASE come to the front
w.toFront();
//even MOAR desperation
SwingUtilities.invokeLater(new Runnable(){
public void run(){
w.toFront(); //STILL no dice.
}
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?我没什么。
如何使JDialog不总是位于父级之上
如本问答中所述:在Jframe中有2个Jdialog的setModal问题:
此行为取决于本机窗口系统如何处理焦点窗口和活动窗口。话虽如此,如果您调用例如toFront(),它将尝试将窗口放置在堆栈的顶部,但是某些平台不允许拥有其他窗口的窗口出现在其子视图的顶部。当您调用toBack()方法时,也会发生相同的情况。有关更多详细信息,请参见javadocs。
例如,在Windows 7上,父对话框变为焦点,但其子对话框仍在顶部显示(而不是焦点)。如上所述,由窗口系统决定如何处理此问题。