0

我发现我的容器实际上在构建后不久就改变了它的大小

构建完成后,我将组件设置在我想要的位置(例如距离右边缘 30 像素),但不久之后,我发现它从 1008x730 变为 1018x740...

(我的 JFrame 是 1024x768)

有谁知道为什么会发生这种情况以及如何阻止这种自动调整大小的事情?

谢谢你。

我刚刚做了一个 -

while (true) {
        System.out.println(c.getSize());
}

几次迭代后大小发生了变化。

~编辑

4

3 回答 3

2

听起来您正在做一些改变组件大小并调用pack(). JFrame此外,与调用 相比setSize(),设置组件的首选大小并让其LayoutManager安排通常会更好。

附录:通常最好pack()顶级容器上调用以获得正确的初始大小。此外,a 的内容窗JFrame格默认为BorderLayout,这可能不是您想要的。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyPanel extends JPanel {

    public MyPanel() {
        this.setLayout(new GridLayout(2, 2));
        this.setPreferredSize(new Dimension(320, 240));
        for (int i = 0; i < 4; i++) {
            JLabel label = new JLabel(String.valueOf(i));
            label.setHorizontalAlignment(JLabel.CENTER);
            label.setBorder(BorderFactory.createLineBorder(Color.blue));
            this.add(label);
        }

    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                create();
            }
        });
    }
}
于 2010-01-30T17:20:44.487 回答
1

如果您可以从 IDE 运行它或使用调试器远程连接,那么只需在设置大小的方法上设置断点就很容易了。

或者,您可以使用自己的类对 JFrame 进行子类化,并类似地覆盖这些方法并执行

try { throw new Exception("here!"); } catch(Exception e) { e.printStackTrace(); }

这会告诉你是什么导致了大小的变化。

于 2010-01-30T15:49:59.810 回答
1

听起来像是布局管理器开始了。尝试使用 Swing Explorer 运行,看看它对世界的看法。

于 2010-01-30T17:18:28.437 回答