您好我正在编写一个简单的程序来显示一个框架。 然而,当我输入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();
}
});
}
}
答案 0 :(得分:5)
您使用绝对定位( null 布局)调用pack()
方法,您应该使用LayoutManager而不是将布局设置为null
。
只需删除此行:
pane.setLayout(null);
注意:接受我的建议并自学LayoutManagers
,因为如果你拒绝学习,你可能会去null
布局,是的,它更容易但是强烈建议不要使用它。
你必须知道一些基本的事情:
JFrame
的默认布局为BorderLayout,您只能在五个位置放置您的组件,如链接所示。毕竟,在开始使用swing之前,请阅读更多关于LayoutManagers的内容,相信我它会使您的工作变得更轻松,只需尝试一下,这太棒了。
答案 1 :(得分:5)
如果你看到 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),因此您遇到了这个问题。删除该语句或使用某种布局。
答案 2 :(得分:2)
Java GUI可能必须在许多平台上工作,在不同的屏幕分辨率和使用不同的PLAF。因此,它们不利于组件的精确放置。
要组织强大的GUI组件,而是使用布局管理器或它们的组合,以及布局填充和放大器。白色空间的边界。
有关如何:
的提示,请参阅this answer
答案 3 :(得分:1)
幸运的是我有同样的问题,我用一行代码解决了。愿这也有助于您尝试按照以下步骤操作:
1-转到你的文件代码
2-在代码开头找到这一行:
initComponents();
3-只需在此行之后添加此新代码:
this.setMinimumSize(new Dimension(300, 300));
关键字"此"这里代表您当前的顶级组件,因此这里应用了新的尺寸(300,300)。您可以根据所需的框架/组件大小更改此300个值。