代码如下:
public class Help extends JFrame {
Help(){
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JDialog d=new JDialog(this);
d.setSize(320, 240);
d.setVisible(true);
d.setModal(true);
} public static void main(String[] args) {
new Help();
}
}
为什么我把JDialog用setModal(true)设置成有模式窗口时界面上还是无模式窗口,非要在setModal之后加上d.setVisible(false);d.setVisible(true);两句话才行,而且画面会闪烁下。
请问有什么方法可以在setModal(true)之后不用d.setVisible(false);d.setVisible(true);就能把窗口设为模式窗口。
[由于种种原因,我不能在构造涵数中设置,初始时无模式的JDialog就show在界面上了。]

解决方案 »

  1.   

    在界面设计中,在构造方法中要把d.setVisible(true);这代码放在最后一句
      

  2.   

    这个我知道,但这个由于特殊原因,JDialog已经显示了,上面的程序只是个能说明我问题的简单例子,并不是我要解决的实际问题。
      

  3.   

    API中说:
    注:更改可见 dialog 的模式只在隐藏该 dialog 并再次显示它时产生效果。
    所以只能用楼主说的那种方法.但是如果楼主想要的是视觉效果的话可以这样:
    再创建一个一模一样的对话框...然后在刚才那个对话框setVisible(false)之前显示出来.然后加一个addMouseMotionListener
    在mouseMoved中把那个假的对话框关掉...参考一下
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;public class Help extends JFrame {
    Help(){
    setSize(400, 300);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JDialog d = new JDialog(this);
    final JDialog d1 = new JDialog(this);
    d1.setSize(320, 240);
    d.setSize(320, 240);
    d.setVisible(true);
    d.setModal(true);
    d1.setVisible(true);
    d.addMouseMotionListener(new MouseMotionListener() {
    public void mouseDragged(MouseEvent event) {}
    public void mouseMoved(MouseEvent event) {
    d1.setVisible(false);
    d1.dispose();
    }
    });
    d.setVisible(false);
    d.setVisible(true);
    } public static void main(String[] args) {
    new Help();
    }
    }另外我看API上说让用setModalityType这个方法替代setModal
      

  4.   

    jdk5.0好像没有setModalityType这个方法啊,晕真。
      

  5.   

    setModalityType也解决不了你的问题,只不过是替代了setModal
    要想生效还是要
    setVisible(false);
    setVisible(true);
      

  6.   

    看一下Dialog的Show方法就知道了。
      @Deprecated
        public void show() {
            beforeFirstShow = false;
            if (!isModal()) {
                conditionalShow(null, null);
            } else {
            ……
      }
      从上面的方法可以看出,在对话框显示的时候,需要先知道当前的对话框是不是模态滴,
      然后才会去显示,对于模态和非模态的对话框使用的显示方法是不一样的。  所以在对话框已经显示了之后再把它设置成是模态的,应该是不行的。
      这样会产生一个两种状态都不像的对话框。
      
      晕死~~~不过你的这样的要求真是太奇特了。
      

  7.   

    老大你就不能把它刷新一下吗?validate()用这个方法就可以了