打开一个模态JDialog,怎么才让父窗体在dialog关闭后才得到其返回值

时间:2021-10-20 23:41:05
我在applet点击按钮打开一个jdialog,想在jdialog里做一些操作,置一下关闭标志位后,设置一些它的值,再关闭dialog,这时在父窗体里读取一下这个值(判断一下标志位为关闭时才读取),但现在是一打开jdialog在父窗体的按钮点击事件里就读到了标志位,而这个标志位在刚打开jdialog默认是“开”,没来得及做操作,就退出了点击事件了,造成无法读取jdialog设置的一下属性,这是怎么回事?

打开jdialog方法如下:
public void showdialog(JDialog dialog){
dialog.toFront();
dialog.setModal(true);
dialog.setVisible(true);
return dialog.getCloseFlg().equals(Constants.DIALOG_CLOSE);
}
按钮单击事件:
if (showdialog(new AAADialog()).equals(Constants.DIALOG_CLOSE)){
  //do something
}

12 个解决方案

#1


将该dialog的parent设置为当前容器,只能操作完该dialog才可以操作parent。。。

#2


问题是我的dialog并不是JDialog,而是继承自BaseJDialog,它是共通类,我无权修改,别的公司做的,它是继承JDialog的。

#3


奇怪的是,现有系统里存在的一些dialog好用,而我的不好用,它们也是继承basejdialog,我没发现我的程序和它们有什么区别。

#4


setModal(true);

#5


showdialog里已经设了,不行啊

#6


是不是构造了之后再设置就无效了。

#7


原因找到了,setVisuable必须在设置是否为模态之后才能设置为true,而我在dialog的构造函数中已经设置为可视了,所以模态没起作用,但我必须这样设啊,因为只有setVisuable(true)之后,内容面板才能取得其真实宽度和高度,我要取它们自动进行一些布局,在不改变系统类的前提下,有什么办法解决吗?

#8


不可以在构造函数中先设置modal,再设置可视吗?:)
或者在dialog中提供方法获得size?

#9


to zhuokai:
  这样做的结果是,在applet里点击按钮的时候会打开2个jdialog,第一个颜色什么的,都不正常,而且有很多东西被实例化,不知为何,第二个才是正常的。好像只有在调用者那里先设置modal后设置visiable才行,在jdialog里这样顺序的设置没用。

#10


没碰到过这种,不清楚了。。。

#11


dialog.getCloseFlg().equals(Constants.DIALOG_CLOSE)
-----------
这是干什么呢?
模态对话框不用自己设置什么关闭标识。
不知道你有没有用过Delphi,delphi中对话框使用模式:
if(dlg==null)
 dlg = new MyDialog();

if(dlg.showModal()){
  //do somthing!
}
你的明白?

-------------------------------
因为只有setVisuable(true)之后,内容面板才能取得其真实宽度和高度,我要取它们自动进行一些布局
-------------------------------------------
这种其实你可以在构造函数中
setModal(false);
setVisable(true);
//布局
setVisable(false);
然后再作其它操作。

#12


dialog.getCloseFlg().equals(Constants.DIALOG_CLOSE)这个是我在按钮里判断一下,等dialog关闭时做一些操作。在构造函数中这样setModal(false);setVisable(true);不行,会打开2次,第一次是不正常的显示,第2次才正常。而且我必须通过showdialog这个系统方法去打开dialog,可能再在构造函数里设置可见、模态可能就不行了。

#1


将该dialog的parent设置为当前容器,只能操作完该dialog才可以操作parent。。。

#2


问题是我的dialog并不是JDialog,而是继承自BaseJDialog,它是共通类,我无权修改,别的公司做的,它是继承JDialog的。

#3


奇怪的是,现有系统里存在的一些dialog好用,而我的不好用,它们也是继承basejdialog,我没发现我的程序和它们有什么区别。

#4


setModal(true);

#5


showdialog里已经设了,不行啊

#6


是不是构造了之后再设置就无效了。

#7


原因找到了,setVisuable必须在设置是否为模态之后才能设置为true,而我在dialog的构造函数中已经设置为可视了,所以模态没起作用,但我必须这样设啊,因为只有setVisuable(true)之后,内容面板才能取得其真实宽度和高度,我要取它们自动进行一些布局,在不改变系统类的前提下,有什么办法解决吗?

#8


不可以在构造函数中先设置modal,再设置可视吗?:)
或者在dialog中提供方法获得size?

#9


to zhuokai:
  这样做的结果是,在applet里点击按钮的时候会打开2个jdialog,第一个颜色什么的,都不正常,而且有很多东西被实例化,不知为何,第二个才是正常的。好像只有在调用者那里先设置modal后设置visiable才行,在jdialog里这样顺序的设置没用。

#10


没碰到过这种,不清楚了。。。

#11


dialog.getCloseFlg().equals(Constants.DIALOG_CLOSE)
-----------
这是干什么呢?
模态对话框不用自己设置什么关闭标识。
不知道你有没有用过Delphi,delphi中对话框使用模式:
if(dlg==null)
 dlg = new MyDialog();

if(dlg.showModal()){
  //do somthing!
}
你的明白?

-------------------------------
因为只有setVisuable(true)之后,内容面板才能取得其真实宽度和高度,我要取它们自动进行一些布局
-------------------------------------------
这种其实你可以在构造函数中
setModal(false);
setVisable(true);
//布局
setVisable(false);
然后再作其它操作。

#12


dialog.getCloseFlg().equals(Constants.DIALOG_CLOSE)这个是我在按钮里判断一下,等dialog关闭时做一些操作。在构造函数中这样setModal(false);setVisable(true);不行,会打开2次,第一次是不正常的显示,第2次才正常。而且我必须通过showdialog这个系统方法去打开dialog,可能再在构造函数里设置可见、模态可能就不行了。