java - 添加/更改影响父级 setBounds 的 JLabels

标签 java swing

我对 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/

相关文章:

java - KeyBindings 卡在 actionPerformed() 上

java - 在 TCP Client 中从服务器接收消息并在 TextView 中设置它

java - 在 Java FX 2.0 中滚动锚定节点时始终可见?

java - 如何在 JSON/avsc 中标记已弃用的 avro 字段?

java - 无法在 Java 中读取 Word 文档内容

java - 我如何从 java swing 表单的目录中添加数字图像?

java - 在maven项目中添加外部jar

java - Spring注入(inject)XML未编码实体

java - JPanel 上的 mouseDragged 事件上的铅笔绘图?

java - 是否可以在 JTextfield 上虚拟地抛出 KeyEvent?