JPanel有一个继承的方法add
add
public void add(Component comp,
                Object constraints)将指定的组件添加到此容器的尾部。同时通知布局管理器使用指定的 constraints 对象将组件添加到此容器的布局中。对于 addImpl(java.awt.Component, java.lang.Object, int) 来说,这是一种便捷的方法。 
注:如果已经将某个组件添加到显示的容器中,则必须在此容器上调用 validate,以显示新的组件。如果添加多个组件,那么可以在添加所有组件之后,通过只调用一次 validate 来提高效率。 
参数:
comp - 要添加的组件
constraints - 表示此组件的布局约束的对象
从以下版本开始: 
JDK1.1 
另请参见:
addImpl(java.awt.Component, java.lang.Object, int), validate(), JComponent.revalidate(), LayoutManager
这个应该怎样理解?
如果我添加的constraints是String类型的怎样理解?我搜到一个一样问题好像没有完全解决啊http://topic.csdn.net/u/20081015/12/fa35f21f-8e02-46b5-93d1-45ac57aac846.html

解决方案 »

  1.   

    addImpl
    protected void addImpl(Component comp,
                           Object constraints,
                           int index)将指定组件添加到此容器的指定索引所在的位置上。此方法还通知布局管理器,通过 addLayoutComponent 方法,使用指定的约束对象将组件添加到此容器的布局中。 
    这些约束是由正使用的特定布局管理器定义的。例如,BorderLayout 类定义了五个约束:BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.EAST、BorderLayout.WEST 和 BorderLayout.CENTER。 GridBagLayout 类需要一个 GridBagConstraints 对象。如果传递正确的约束对象类型时失败,则会导致 IllegalArgumentException。 如果当前布局管理器实现了 LayoutManager2,则在其上调用 LayoutManager2.addLayoutComponent(Component,Object)。如果当前布局管理器没有实现 LayoutManager2,并且约束是一个 String,则在其上调用 LayoutManager.addLayoutComponent(String,Component)。 如果该组件不是此容器的祖先容器,并且有一个非 null 父组件,则在将该组件添加到此容器之前,从其当前父组件中移除它。 在其他所有添加方法引用此方法时,如果某个程序需要追踪每个添加到容器的请求,那么这就是要重写的方法。被重写的方法通常应该包括一个对该方法的超类版本的调用: 
    super.addImpl(comp, constraints, index) 
    参数:
    comp - 要添加的组件
    constraints - 表示此组件的布局约束的对象
    容器列表中插入组件的位置;其中 - -1 表示将组件追加到尾部 
    抛出: 
    IllegalArgumentException - 如果 index 无效;如果 comp 是此容器的子容器,则有效范围是 [-1, getComponentCount()-1];如果组件不是此容器的子容器,则有效范围是 [-1, getComponentCount()] 
    IllegalArgumentException - 如果 comp 是此容器的祖先容器 
    IllegalArgumentException - 如果向容器添加一个窗口 
    NullPointerException - 如果 comp 为 null
    从以下版本开始: 
    JDK1.1 
    另请参见:
    add(Component), add(Component, int), add(Component, java.lang.Object), LayoutManager, LayoutManager2
      

  2.   

    看看API应该不难理解吧 约束就是布局中指定位置的  
    BorderLayout.CENTER 的值就是string类型的 值为center
    再者API中也提到了如果使用的是gridbaglayout的话 那么他加入的约束必须是
    GridBagConstraints 对象 GridBagConstraints 对象指定了 此组件在layout中的位置 高度 描点 间隔等等 有了指定的约束 布局管理器才知道将comp放在什么位置啊 
      

  3.   

    先不看addImpl方法  估计你肯定用过 add(cc,BorderLayout.CENTER) 或add(cc,"center")吧 
    当然你的panel此时谁知的layout代码为setLayout(new BorderLayout());
    borderlayout就是一个layoutmanager
    gridbag的同样也是一样理解 并没有所谓的add(Component c,String ss)方法 如果有这个方法至少borderlayout的约束就失效了  
      

  4.   

    其实你看的太复杂了.实际使用时使用JPanel默認的布局管理器FlowLayout(如果换成别的布局管理器也行),再调用JPanel的add(Component c)方法即可.
    不用太去关心那个String参数.
      

  5.   

    就你说的情况,在JPanel中间容器里面出现add(component,string)是由可能的,譬如:如果你要在JPanel里面实现CardLayout布局,那么首先是需要将组件添加到JPanel里面,然后才能在方法(ActionLisetener)中实现对容器中组件的切换。
    CardLayout card=new CardLayout(5,5);
    JPanel pane=new JPanel(card);// 这个
                    Jbutton btOne=new JButton("one");
                    JButton btTwo=new JButton("two");
    pane.add(btOne,"p1");
    pane.add(btTwo,"p2");

                    btOne.addActionLisetener(new ActionLisetener(){car.show(pane,"p1")});
                    btTwo.addActionLisetener(new ActionLisetener(){car.show(pane,"p2")});
    理解不深刻,请指教!