写了一个窗体,里面有一个菜单~非常简单
发现一个问题,如果没有validate(),运行的时候,只有窗体,显示不出菜单,只有最大化后菜单才出现~~
如果加了validate(),一运行就出现菜单~~
请问,这是为什么?看doc,里面的意思是验证~为什么要验证?菜单项、菜单、菜单条不是已经都依次添加好了吗~
thanks

解决方案 »

  1.   

    import javax.swing.*;class win1 extends JFrame
    {
    JMenuBar jmb;
    JMenu jm;
    JMenuItem item1,item2;
    win1()
    {
    super("hello");
    setVisible(true);
    setSize(200,200);
    jmb=new JMenuBar();
    jm=new JMenu("file");
    item1=new JMenuItem("open");
    item2=new JMenuItem("save");
    jm.add(item1);
    jm.add(item2);
    jmb.add(jm);
    setJMenuBar(jmb);
    setDefaultCloseOperation(3);
    validate();    //这句,如果没有的话,运行时没有菜单,只有最大化才会出现,如果有这句,运行时就有菜单~
    }
    }class gcx
    {
    public static void main(String[] args)
    {
    win1 win=new win1();
    }
    }
      

  2.   

    public void validate()验证此容器及其所有子组件。 
    使用 validate 方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。 
      

  3.   

    楼上,你这个解释完全是API中文版复制过来的
      

  4.   

    LZ:其实可能你没有理解布局的事情,Frame默认的布局方式是BorderLayout
    你把你代码中这两句 setSize(200,200); setVisible(true);放在validate();   后面,这个时间,你可以不用validate();  。其实楼上说的validate();   是再次布置容器内的子组件也是没有错误的。
    你把代码换成如下方式,可以不用validate(); 
    win1()
    {
    super("hello"); jmb=new JMenuBar();
    jm=new JMenu("file");
    item1=new JMenuItem("open");
    item2=new JMenuItem("save");
    jm.add(item1);
    jm.add(item2);
    jmb.add(jm);
    setJMenuBar(jmb);
    setDefaultCloseOperation(3);
    // validate();    //这句,如果没有的话,运行时没有菜单,只有最大化才会出现,如果有这句,运行时就有菜单~
    setSize(200,200);
    setVisible(true); }
      

  5.   

    在我的电脑测试时,没有了validate()这个函数也有菜单显示哦
      

  6.   

    那就是说我写的那段中setSize(200,200);setVisible(true);这两句是规定好了窗体~但后面又写了菜单,所以这是修改了,最后要用validate()重新布置一下~~
    如果先写了菜单,然后再写规定窗体的内容~就等于在最后布置了窗体,所以不用validate()了
    是这样吗?