【问题标题】:Adding/changing JLabels affecting parent's setBounds添加/更改影响父级 setBounds 的 JLabel
【发布时间】:2012-09-22 07:19:56
【问题描述】:

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

我怎样才能阻止它?

【问题讨论】:

  • “请在这件事上逗笑我” 不。使用布局!等到你能弄清楚逻辑的时候以自定义方式布局组件,该逻辑值得放入自定义布局中。但首先要了解如何使用现有的布局。
  • @AndrewThompson 但我想知道 wwhhyyyyyyyyyyyyy!如果你告诉我为什么,我保证我会去了解更多关于布局管理器的信息。 :(
  • 我保证,如果您了解布局管理器,我不会需要告诉您为什么。
  • @AndrewThompson 好的老师。如果是这样的话,但是当我最终弄清楚时,将此线程添加为书签,我有一天会回来回答我自己的问题。这是一个承诺!

标签: java swing


【解决方案1】:

它会将 conPane 重置回它的起始位置

基本上,这是错误的。这是错误的,因为您的假设是错误的:您假设

contPane.setBounds(....)

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

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

归根结底,绝对没有办法学习所有关于布局的知识,即使你坚持不使用它是在浪费时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    相关资源
    最近更新 更多