使用Java布局管理器的目的是什么?

Bob*_*ard 1 java layout swing

似乎每当我尝试创建一个程序时,我总是最终使用setLayout(null);Java中的命令,因为我喜欢绝对定位我正在放置在我的swing组件上的任何东西.从我读到的每个人都一直在说使用布局管理器来简化编码过程,但它如何简化它?平台系统之间的绝对定位会产生什么问题?

tra*_*god 5

使用布局时,调用pack()" Window使其大小适合其子组件的首选大小和布局".如果不这样做,则必须尝试自己计算边界.如果(当)你弄错了,如下面有点人为的例子所示,用户会责怪你 - 而且没有一些理由.这里可以看到关于不可调整大小的容器的相关示例.

图片

import java.awt.EventQueue;
import java.awt.FontMetrics;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

/**
 * @see https://stackoverflow.com/a/37801762/230513
 * @see https://stackoverflow.com/a/12532237/230513
 */
public class Evil {

    private static final String S = "Tomorrow's winning lottery numbers: 42, ";
    private final JLabel label = new JLabel(S + "3, 1, 4, 1, 5, 9");

    private void display() {
        JFrame f = new JFrame("Evil");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(null);
        FontMetrics fm = label.getFontMetrics(label.getFont());
        int w = SwingUtilities.computeStringWidth(fm, S) + 8;
        int h = fm.getHeight();
        label.setBounds(0, 0, w, h);
        f.add(label);
        f.setSize(w, h * 3);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Evil().display();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)