似乎每当我尝试创建一个程序时,我总是会使用setLayout(null);
在 Java 中使用命令,因为我喜欢绝对定位我要放入 Swing 组件上的任何内容。从我读到的内容来看,每个人都在说使用布局管理器来简化编码过程,但它是如何简化的呢?平台系统之间绝对定位会出现什么问题?
当您使用layout https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html,调用pack() https://docs.oracle.com/javase/8/docs/api/java/awt/Window.html#pack--“造成这个Window
调整大小以适合其子组件的首选大小和布局。”如果不这样做,您必须尝试自己计算边界。如果(当)您弄错了,如下面有点人为的示例所示,用户会责怪你——而且不是没有道理的。可以看到一个关于不可调整大小的容器的相关示例here https://stackoverflow.com/a/12532237/230513.
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();
}
});
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)