我还是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孩子的事情,也会发生这种情况。
我该如何阻止它?
答案 0 :(得分:2)
它将conPane重置为它的起始位置
基本上,那是错的。这是错误的,因为你的假设是错误的:你认为
contPane.setBounds(....)
实际上没有效果:负责布局组件的layoutManager是其父的管理者(在此上下文中是RootPaneLayout,你绝对不想搞砸了)。无论你做什么,经理都会将它设置为框架的大小( - insets - 菜单栏)。您可以通过设置contentPane的边框来显示它:
contPane.setBorder(BorderFactory.createLineBorder(Color.RED, 5));
在一天结束时,即使您坚持不使用它而浪费时间,绝对也无法全面了解布局。