添加/更改影响父级setBounds的JLabel

我还是Java的新手,我很喜欢乱搞它,所以请在此幽默我。 我知道布局管理器,但我对摆动的机制感兴趣,所以我使用绝对定位。 任何见解将不胜感激。

所以当我将JLabel添加到JPanel时,我注意到了一种恼人的行为。 例如,如果我这样设置:

JFrame frame=new JFrame("Test Frame"); frame.setSize(800,500); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable (false); JPanel conPane=new JPanel(); conPane.setLayout(null); frame.setContentPane(conPane); conPane.setBounds(0,0,1600,1000); conTP.setFocusable(true); frame.setVisible(true); 

所以现在我移动conPane面板……

 conPane.setBounds(-200,-200,1600,1000); 

然后制作一个新的JLabel ….

 ImageIcon ico=new ImageIcon("directory/testimage.gif"); JLabel myLabel=new JLabel(ico);myLabel.setLayout(null); myLabel.setBounds(300,300,200,200); 

并将其添加到conPane …

 conPane.add(myLabel); 

它将conPane重置为它的起始位置。 在未经我许可的情况下基本上做setBounds(0,0,1600,1000);

如果我移动标签,更改它的图标或几乎做任何涉及改变conPane的孩子的事情,也会发生这种情况。

我怎么能阻止它?

它将conPane重置为它的起始位置

基本上,那是错的。 这是错误的,因为你的假设是错误的:你就是这么认为的

 contPane.setBounds(....) 

实际上它没有效果:负责布局组件的layoutManager是其父级的管理器(在此上下文中是RootPaneLayout,你肯定不想搞砸)。 无论你做什么,经理都会将它设置为框架的大小( – insets – 菜单栏)。 您可以通过设置contentPane的边框来可视化:

 contPane.setBorder(BorderFactory.createLineBorder(Color.RED, 5)); 

在一天结束时,即使您坚持不使用它而浪费时间,也绝对无法全面了解布局。