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

时间:2012-09-22 07:19:56

标签: java swing

我还是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孩子的事情,也会发生这种情况。

我该如何阻止它?

1 个答案:

答案 0 :(得分:2)

  

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

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

contPane.setBounds(....)

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

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

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