我对 Java 还很陌生,而且我很喜欢摆弄它,所以请在这方面逗我开心。我了解布局管理器,但我对 Swing 的机制感兴趣,所以我使用绝对定位。任何见解将不胜感激。
因此,当我将 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 子项的操作,也会发生这种情况。
如何阻止它?
最佳答案
And it resets conPane back to it's starting position
本质上,这是错误的。这是错误的,因为你的假设是错误的:你假设
contPane.setBounds(....)
有效果,但实际上没有:负责布局组件的layoutManager是其父级的管理器(在本上下文中是 RootPaneLayout,你绝对不想搞砸)。无论您做什么,该管理器都会将其设置为框架的大小(-插图-菜单栏)。您可以通过为 contentPane 设置边框来可视化这一点:
contPane.setBorder(BorderFactory.createLineBorder(Color.RED, 5));
归根结底,即使您坚持不使用布局来浪费时间,绝对无法学习所有布局。
关于java - 添加/更改影响父级 setBounds 的 JLabels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12541673/