问题 1:
我正在编写一个程序来使用绝对布局,因为我需要在运行时重新定位 JLabel
。我尝试理解以下 Java 演示程序(来自 Oracle Java 教程):
它建议如下:
//Size and display the window.
Insets insets = frame.getInsets();
frame.setSize(300 + insets.left + insets.right, 125 + insets.top + insets.bottom);
frame.setVisible(true);
在计算 insets
值之前,框架未设置为可见,因此它们都是 0
(零),我说得对吗?
我尝试使用 frame.setSize(300, 125);
替换代码,Eclipse 给出了相同的结果(与我观察到的窗口大小相同)。在 setVisible
之前设置 setSize
是否错误?
问题2:
在我自己的程序中,我有以下代码段:
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JLabel moving_label = new JLabel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
panel.setLayout(null);
frame.add(panel);
panel.add(moving_label);
moving_label.setBounds(150, 150, 50, 50);
moving_label.setIcon(img);
frame.setVisible(true);
frame.setBounds(100, 100, 300+frame.getInsets().left+frame.getInsets().right,
300+frame.getInsets().top+frame.getInsets().bottom);
//I don't need to have panel.validate() or panel.repaint(), right?
a) 上述代码段的顺序是否正确(我是java Swing GUI的新手)?
b) 我在 MacBook Pro 上使用 Eclipse 来运行 Java 程序。我在 JFrame
的 JPanel
中有 40 个 JLabel
(每个都有一个 ImageIcon
)。如果我使用上面的代码生成GUI,则在显示窗口后需要半秒才能显示所有JLabel
。为什么 JLabels 不在显示窗口的同时显示?
任何帮助将不胜感激。非常感谢您的宝贵时间:)
最佳答案
The frame is not set to be visible before the insets values are calculated, so they are all 0 (zero), am I getting it right?
正确,在框架实现之前,组件没有大小,这意味着您正在运行的操作系统上的 native 对象已经创建。当您 pack()
框架或使框架可见时,就会完成此操作。
如果您尝试使包含标签的面板尺寸为 (300, 125),那么更简单的方法是:
JPanel panel = new JPanel();
panel.setPreferredSize( new Dimension(300, 125) );
panel.add(...);
frame.add( panel );
frame.pack();
//frame.setLocation(...);
//frame.setLocationByPlatform();
frame.setVisible( true );
现在 pack() 方法将根据添加到框架的所有组件的首选大小来确定框架的大小。无需担心插图。
注意:作为一般规则,您不应在组件上调用 setPreferredSize(),因为每个组件负责确定自己的大小。
关于java - Oracle Java 教程中的 AbsoluteLayoutDemo.java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27580842/