BoxLayout的构造器:BoxLayout(Container target, int axis) 为什么我总觉得第一个参数是多余的呢?
譬如我有一个面板myPanel,想将它的布局管理器设置为BoxLayout布局管理器
Panel myPanel=new Panel();
myPanel.setLayout(new BoxLayout(BoxLayout.Y_AXIS));这不挺好了吗?对于BoxLayout的构造器的第一个参数不能理解?
是我理解的不对,还是SUN当时设计API时不合理(譬如他们早期版本的某些类的命名就没遵守自己的规范,比如Hashtable)?求指导。JavaAPI布局
譬如我有一个面板myPanel,想将它的布局管理器设置为BoxLayout布局管理器
Panel myPanel=new Panel();
myPanel.setLayout(new BoxLayout(BoxLayout.Y_AXIS));这不挺好了吗?对于BoxLayout的构造器的第一个参数不能理解?
是我理解的不对,还是SUN当时设计API时不合理(譬如他们早期版本的某些类的命名就没遵守自己的规范,比如Hashtable)?求指导。JavaAPI布局
public static javax.swing.Box createHorizontalBox();
public static javax.swing.Box createVerticalBox();
方法。
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的设计不好,因为出现了循环依赖关系,不然就没有问题了
API中是有不一致的,但是不是每一个都不一致。我的疑问是如果我不用Box这个容器,我用别的容器譬如JPanel,我想设置它的布局为BoxLayout。我先new一个BoxLayout,传给参数BoxLayout.Y_AXIS,然后调用myJPanel.setLayout(new BoxLayout(BoxLayout.Y_AXIS)),这不挺好的吗,和其他布局管理器的用法也一致。我对BoxLayout的构造器的第一个参数疑问,觉得没必要。我想知道的是它确实是API设计的不合理还是我自己的理解不对大哥,你看懂问题在回答好不好....你老是Box容器,我知道Box容器,不用你说。我的疑问你根本抓不到要点。
BoxLayout是布局管理器,不是容器,大哥这里只是把panel的布局管理器设置为BoxLayout,传进去的参数表示这个布局管理器里面的组件是竖着摆放panel把自己搞进去做什么?。如果我把panel的布局管理器设为边界布局,不是这样写吗:myPanel.setLayout(new BorderLayout());难道myPanel也要把自己搞进BorderLayout里面?
哎,总觉得这个BoxLayout的构造器的参数,其中第一个参数是不必要的,不知道确实是API设计的不合理,还是我的认知有偏差?