嗨,我正在写一个简单的程序来显示一个框架。然而,当我输入setLayout(Null)时,框架变得非常小;但是如果我忽略这个命令,按钮总是在顶部中心,有人能指出我的错误吗?
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class theframe {
private static void create() {
JFrame frame = new JFrame("FrameDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Insets insets = frame.getInsets();
frame.setSize(500 + insets.left + insets.right, 350 + insets.top + insets.bottom);
add(frame.getContentPane()); //my function add
frame.pack();
frame.setVisible(true);
}
public static void add(Container pane) {
pane.setLayout(null);
Insets insets = pane.getInsets();
JPanel p1 = new JPanel();
p1.setPreferredSize(new Dimension(500, 350));
JButton b1 = new JButton("one");
Dimension size = b1.getPreferredSize();
b1.setBounds(25 + insets.left, 5 + insets.top, size.width, size.height);
pane.add(p1);
p1.add(b1);
}
public static void main(String Args[]) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
create();
}
});
}
}发布于 2013-07-25 20:56:36
您正在使用绝对定位(空布局)调用pack()方法,您应该使用LayoutManager而不是使用将布局设置为null。
只需删除这一行:
pane.setLayout(null);备注:听从我的建议,自学LayoutManagers,因为如果你拒绝学习,你可能会去null layout,是的,它更容易,但强烈建议你不要使用它。
以下是你必须知道的一些基本情况:
JFrame的默认布局是BorderLayout,只有五个位置可以放置组件,如link.毕竟,在开始使用swing之前先阅读更多关于LayoutManagers的知识,相信我,它会让你的工作变得非常容易,试一试,它是令人惊叹的。
发布于 2013-07-25 21:01:00
如果您看到pack()函数,它不在JFrame.java中,而在Window.java中
public void pack() {
Container parent = this.parent;
if (parent != null && parent.getPeer() == null) {
parent.addNotify();
}
if (peer == null) {
addNotify();
}
Dimension newSize = getPreferredSize();
if (peer != null) {
setClientSize(newSize.width, newSize.height);
}
if(beforeFirstShow) {
isPacked = true;
}
validateUnconditionally();
}现在,如果您在Container.java中看到getPreferredSize()函数
@Deprecated
public Dimension preferredSize() {
/* Avoid grabbing the lock if a reasonable cached size value
* is available.
*/
Dimension dim = prefSize;
if (dim == null || !(isPreferredSizeSet() || isValid())) {
synchronized (getTreeLock()) {
prefSize = (layoutMgr != null) ?
layoutMgr.preferredLayoutSize(this) :
super.preferredSize();
dim = prefSize;
}
}
if (dim != null){
return new Dimension(dim);
}
else{
return dim;
}
}一切都归结为layoutMgr.preferredLayoutSize(this);,因为你没有设置布局(或null),你就会遇到这个问题。要么删除该语句,要么使用某种布局。
发布于 2013-07-25 21:09:14
Java GUI可能需要在不同的平台上工作,使用不同的屏幕分辨率&使用不同的平台。因此,它们不利于零部件的精确放置。
要组织组件以实现健壮的GUI,请改用布局管理器或它们的组合,以及布局填充和空白边框。
有关如何执行以下操作的提示,请参阅this answer:
使用布局构造函数参数和边框组合layouts.

https://stackoverflow.com/questions/17858500
复制相似问题