假设我有一个名为JLayeredPane
的{{1}}正在使用mainPanel
。我还有一个名为BorderLayout
的{{1}}包含图片。如何将JLabel
添加到backgroundLabel
的底层?
backgroundLabel
以上这一行似乎是一个明显的答案,如果mainPanel
使用的是null布局,它就会起作用。 mainPanel.add(backgroundLabel, new Integer(-1), new Integer(0));
中的mainPanel
不喜欢命令,并提供以下堆栈跟踪。
BorderLayout
如何将mainPanel
添加到Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: cannot add to layout: constraint must be a string (or null)
at java.awt.BorderLayout.addLayoutComponent(Unknown Source)
at java.awt.Container.addImpl(Unknown Source)
的底层而不与backgroundLabel
冲突?
答案 0 :(得分:3)
如How to Use Layered Panes: Laying Out Components in a Layered Pane中所述," Java平台提供的所有布局管理器都将组件排列在同一层上。"您已指定BorderLayout
。您拨打add()
的电话会调用addImpl(java.awt.Component, java.lang.Object, int)
。由于BorderLayout
实现了LayoutManager2
,因此constraints
参数的值必须是为BorderLayout
定义的String
约束,而不是具有该值的Integer
-1
,例如
mainPanel.add(backgroundLabel, BorderLayout.SOUTH, 0);
我的目的是将
backgroundLabel
添加到其所有其他组件后面的底层。
在JLayeredPane
上设置布局会使组件像在一层上一样。"而是在占据最深层的组件上设置布局,并将标签添加到该组件。在此example中,标签和按钮会添加到具有默认JPanel
的每个图层FlowLayout
中。