java - Oracle Java 教程中的 AbsoluteLayoutDemo.java

标签 java swing

问题 1:

我正在编写一个程序来使用绝对布局,因为我需要在运行时重新定位 JLabel 。我尝试理解以下 Java 演示程序(来自 Oracle Java 教程):

http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/layout/AbsoluteLayoutDemoProject/src/layout/AbsoluteLayoutDemo.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 程序。我在 JFrameJPanel 中有 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/

相关文章:

java - 对 Path2D 的绘图进行动画处理

java - 如何根据用户点击替换 jPanel

java - Swing:MouseListener 仅在 ImageIcon 上而不是 JLabel 上

java - 在 HTMLEditorKit/JEditorPane 中强制使用 <strong> 而不是 <b>

java - jTree节点选择

java - 尝试从数据库获取对象列表时获取重复的最后一个表单数据的列表

java - 更高效的 compareTo 算法?

java - Java中TreeMap和LinkedHashMap的可视化

java - URL.getHost() 的解析结果

java - 直接在 JPA/JPQL 中将行插入连接表?