我发现我的容器实际上在构建后不久就改变了它的大小
当它被构造时,我将我的组件设置在我想要的位置(比如右边缘30px),但稍后,我发现它从1008x730变为1018x740 ......
(我的JFrame是1024x768)
有谁知道为什么会发生这种情况以及如何阻止这种自动调整大小的事情?
谢谢。
我刚做了一个 -
while (true) {
System.out.println(c.getSize());
}
经过几次迭代后,尺寸发生了变化。
〜编辑的
答案 0 :(得分:2)
听起来你正在做一些改变组件大小的事情,并在<{em>} pack()
上调用JFrame
后重新验证。此外,不是调用setSize()
,而是设置组件的首选大小并让LayoutManager
安排事情通常更好。
附录:通常最好在top-level container上调用pack()
以获得正确的初始尺寸。此外,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();
}
});
}
}
答案 1 :(得分:1)
如果您可以从IDE运行此程序或使用调试程序远程连接,则可以很容易地在设置大小的方法上设置断点。
或者,您可以使用自己的类继承JFrame,并类似地覆盖这些方法并执行
try { throw new Exception("here!"); } catch(Exception e) { e.printStackTrace(); }
这会告诉你导致尺寸变化的原因。
答案 2 :(得分:1)
听起来就像布局经理一样。尝试使用Swing Explorer运行,看看它对世界的看法。