Mar*_*tin 6 java swing exception flowlayout boxlayout
我对此感到困惑.
案例A.
案例B
为什么案例A抛出异常而案例B没有抛出异常?为什么FlowLayout和BoxLayout在这方面表现不同?在案例A中,"BoxLayout无法共享"是什么意思?
我在这个网站上读过一些关于这个异常消息的类似线程,但我仍然对与FlowLayout的比较以及异常消息的确切含义感到困惑.
基本上,"BoxLayout can't be shared"在这种情况下意味着你正试图让你JFrame和它contentPane()共享同一个BoxLayout对象.
设置Layouta时JFrame,它会隐含地调用,getContentPane().setLayout(manager)因此您实际上是在设置contentPane()的布局而不是框架本身.
这给我们带来了容器内如何检查BoxLayout和FlowLayout.
FlowLayout
此布局没有将容器作为参数的构造函数,因此在构造对象时不会考虑容器.这个类都没有container实例变量.
BoxLayout
BoxLayout相反,它有一个构造函数,它将容器作为参数并将其存储在实例变量中target.这样做是为了稍后在layoutContainer(container)方法中进行检查.它有一个checkContainer(container)方法可以验证实例变量是否等于参数中给出的容器.throw new AWTError("BoxLayout can't be shared");如果不是这样,它会抛出.
这是对以下解释的介绍.
如第一段所述,JFrame.setLayout(LayoutManager)将调用JFrame.getContentPane().setLayout(LayoutManager),因此默认Layout设置contentPane()为a JPanel.
查看构造函数BoxLayout(container, int)并问自己:
现在我知道布局是在JPanel(contentPane())而不是JFrame自身上设置的,我将给这个构造函数赋予哪个参数?
给它JFrame自己一个好主意吗?知道它不是布局中已设置的组件吗?
答案是:当然这不是一个好主意.
以下是实现此目的的正确方法:
JFrame frame = new JFrame();
frame.setLayout(new BoxLayout(frame.getContentPane(), ...);
Run Code Online (Sandbox Code Playgroud)
为什么?
因为我们现在知道容器是,contentPane()并且最终,例如,当添加组件时,将进行检查,并且构造函数中的参数必须与设置object的组件完全相同,而组件中的参数layout不会与FlowLayout例如.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |