BoxLayout的构造器:BoxLayout(Container target, int axis) 为什么我总觉得第一个参数是多余的呢?
譬如我有一个面板myPanel,想将它的布局管理器设置为BoxLayout布局管理器
Panel myPanel=new Panel();
myPanel.setLayout(new BoxLayout(BoxLayout.Y_AXIS));这不挺好了吗?对于BoxLayout的构造器的第一个参数不能理解?
是我理解的不对,还是SUN当时设计API时不合理(譬如他们早期版本的某些类的命名就没遵守自己的规范,比如Hashtable)?求指导。JavaAPI布局

解决方案 »

  1.   

    一般使用 javax.swing.Box类的
      public static javax.swing.Box createHorizontalBox();
      public static javax.swing.Box createVerticalBox();
    方法。
      

  2.   

    jdk的api中不一致的多了。至于 BoxLayout,有 Box这个使用BoxLayout布局的容器。
      

  3.   

    原因我想大概是这样的:
    1. BoxLayout一经创建,它的Container属性是不允许更改的,这就限制了它不能有一个类似“setConatiner"的方法
    2. 由1得出,要让BoxLayout含有Container,而又不能有一个setter,那只能是在构造器里传入了
    3. Panel是一个Container,在javax.awt包里,BoxLayout在javax.swing包里,所以一个默认访问权限的setter也是不合适的(事实上BoxLayout可以使用很多其他的Container,只要它继承了javax.awt.Container这个类)。 你想,假设你写了myPanel.setLayout(new BoxLayout(BoxLayout.Y_AXIS));,Panel得想个办法把自己搞进BoxLayout里去吧,它只能调用一个setter来实现综合以上三点,基本上得出了BoxLayout要想获得Container,只能通过构造函数。另外我觉得真正有疑问的是,为什么不在new BoxLayout(Container target, blabla);的时候,调用target.setLayout(this);?我其实对swing完全没有了解,不知道是不是一个layout对应的container一定要使用该layout?如果是这样,那我就觉得这一部分API的设计不好,因为出现了循环依赖关系,不然就没有问题了
      

  4.   

    完全不着边际的回答。
    API中是有不一致的,但是不是每一个都不一致。我的疑问是如果我不用Box这个容器,我用别的容器譬如JPanel,我想设置它的布局为BoxLayout。我先new一个BoxLayout,传给参数BoxLayout.Y_AXIS,然后调用myJPanel.setLayout(new BoxLayout(BoxLayout.Y_AXIS)),这不挺好的吗,和其他布局管理器的用法也一致。我对BoxLayout的构造器的第一个参数疑问,觉得没必要。我想知道的是它确实是API设计的不合理还是我自己的理解不对大哥,你看懂问题在回答好不好....你老是Box容器,我知道Box容器,不用你说。我的疑问你根本抓不到要点。
      

  5.   

    “myPanel.setLayout(new BoxLayout(BoxLayout.Y_AXIS));Panel得想个办法把自己搞进BoxLayout里去吧”
    BoxLayout是布局管理器,不是容器,大哥这里只是把panel的布局管理器设置为BoxLayout,传进去的参数表示这个布局管理器里面的组件是竖着摆放panel把自己搞进去做什么?。如果我把panel的布局管理器设为边界布局,不是这样写吗:myPanel.setLayout(new BorderLayout());难道myPanel也要把自己搞进BorderLayout里面?
    哎,总觉得这个BoxLayout的构造器的参数,其中第一个参数是不必要的,不知道确实是API设计的不合理,还是我的认知有偏差?
      

  6.   

    我说的搞进去是指让对方含有自己的引用,我并没有管它们各自实现了什么功能。从api上看,Layout必须包含对Container的引用才能正常工作,而这个container一旦指定便不能更改。要想实现这个功能,只能在Layout的构造函数传入Container。你认为Layout不需要容器的引用就能实现布局管理的功能,但是JDK的实现并不是这样,Layout并不是一个简单的布局定义,它还负责对容器内东西的排列。如果按你的理解,Layout的一些列实现都可以替换成enum了,因为它只负责告诉Container应该怎么排列元素,而具体的排列功能的实现在Container中
      

  7.   

    建议你看看BorderLayout,FlowLayout,GridLayout的构造器,这几个构造器里都没有容器的引用,然后哪个容器想使用他们,直接调用容器的setLayout(new XXXLayout())即可。
      

  8.   

    我想是因为BoxLayout包含了对container的引用,为了保持一致性,其他的Layout也在构造器里面加入了Container,虽然可能不需要。其他我也不知道有什么合理解释了