我有3个对话框,可以在我的项目中一起显示。
setVisibleOnTop(false)
无模式的。setVisibleOnTop(true)
无模式的。setVisibleOnTop(true)
的应用模式。现在的问题是:
APPLICATION_MODAL
属性打开“第三个”对话框时,其他任何JComponent
都不应接受该点击。这适用于java 1.7。现在的问题是:
APPLICATION_MODAL
对话框(第三个)时,为什么对话框“one”出现在前面?setAlwaysOnTop(true)
的对话框会回来?示例代码:
import java.awt.Frame;
import javax.swing.JDialog;
class MyDialog1 extends JDialog {
MyDialog1 ()
{
super();
super.setVisible(false);
setTitle("one");
}
}
class MyDialog2 extends JDialog {
MyDialog2 ()
{
super(null,ModalityType.MODELESS);
setAlwaysOnTop(true);
setTitle("second");
}
}
class MyDialog3 extends JDialog {
MyDialog3 ()
{
super(new Frame(),ModalityType.APPLICATION_MODAL);
setTitle("third");
setAlwaysOnTop(true);
super.setVisible(false);
}
}
public class ModalityIssue {
public static void main(String args[])
{
MyDialog1 d1=new MyDialog1();
d1.setSize(600, 600);
MyDialog2 d2=new MyDialog2();
d2.setSize(500, 500);
MyDialog3 d3=new MyDialog3();
d3.setSize(400, 400);
d1.setVisible(true);
d2.setLocationRelativeTo(d1);
d2.setVisible(true);
d3.setLocationRelativeTo(d2);
d3.setVisible(true);
}
}
答案 0 :(得分:1)
不要使用awt组件
JFrame忽略alwaysOnTop和modality,
使用初始线程,
重要的是代码排序
你可以使用aplication方式(似乎更好,但没有人知道是否符合你的要求)
MyDialog1总是闪烁(MyDialog2在MyDialog1之前被绘制,然后跳过惊吓MyDialog2,标准用户无法捕获它),也许没有任何JComponents添加到当前JVM中的任何顶级容器< / p>
例如(Java 1.6.21 / 025/031,同样的corerctly适用于1.7.04和1.8.60 / 66 / win10)
import java.awt.Dialog.ModalityType;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
class MyDialog1 extends JDialog {
public MyDialog1() {
super(null, ModalityType.MODELESS);
setAlwaysOnTop(true);
setTitle("fist");
}
}
class MyDialog2 extends JDialog {
public MyDialog2() {
super(null, ModalityType.MODELESS);
setAlwaysOnTop(true);
setTitle("second");
}
}
public class ModalityIssue {
private JFrame frame = new JFrame();
private MyDialog1 d1 = new MyDialog1();
private MyDialog2 d2 = new MyDialog2();
public ModalityIssue() {
frame.setTitle("third");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setLocation(100, 100);
frame.setVisible(true);
d1.setSize(400, 300);
d1.setLocation(200, 200);
d1.setVisible(true);
d2.setSize(400, 300);
d2.setLocation(300, 300);
d2.setVisible(true);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ModalityIssue();
}
});
}
}