为什么在有些情况下使用pack(),只能看见标题栏,内容要放大才能看见呢?
这个问题跟你使用的layout有关。
先看一下关于pack()的解释:
Java中的pack()方法是什么意思? 悬赏分:0 - 解决时间:2008-9-1 23:02Java中的pack()方法是什么意思? 提问者: junqin14 - 童生 一级 最佳答案 检举关于pack()方法 在 Frame 类中有一个从类 java.awt.Window 继承的方法 pack() show() 同样也继承自 java.awt.Window public void pack() 调整此窗口的大小,以适合其子组件的首选大小和布局。如果该窗口和/或其所有者仍不可显示,则两者在计算首选大小之前变得可显示。在计算首选大小之后,将会验证该 Window。 5回答者: ttpsan520 - 秀才 二级 2008-9-1 17:13java关于Frame类的pack()方法 悬赏分:10 - 解决时间:2009-3-18 18:30先声明了一个Frame类的实例f,和一个Button类的示例b,然后f.add(b);运行程序之后窗口只有一个标题栏,没有按钮.然后书上加了个f.pack();语句就能显示按钮了,这是为什么?pack方法是干什么用的? 提问者: 宅与不宅 - 试用期 一级 最佳答案 检举f.pack()做了这样一件事f.setSize(f.getPreferredSize());在你没加f.pack()之前,f窗体的大小是(0,0)当你加了以后,f的大小会被设置为恰当大小,也就是prefrredSize 1回答者: htaohongtao - 助理 二级 2009-3-18 12:05 我来评论>>提问者对于答案的评价:谢谢
下面是我的调试记录:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package testpackmethod;
import javax.swing.*;
import java.awt.*;
/**
*
* @author Administrator
*/
public class Main {
/**
* @param args the command line arguments
*/
Main() {
JFrame jFrame = new JFrame("Test pack()");
JButton jbt = new JButton("ok");
JPanel jPanel = new JPanel();
// jFrame.setLayout(new FlowLayout());//可看见按钮居中显示,放大后居上方中央
// jFrame.add(jbt);
// jFrame.setLayout(new BorderLayout());//可看见按钮占据中央,并且可延伸
// jFrame.add(jbt);
// jFrame.setLayout(new GridLayout(1,1));//可看见按钮,效果同上
// jFrame.add(jbt);
// jFrame.setLayout(new SpringLayout());//放大后才可看见按钮居左上方,未放大时,整个框架都被pack up了。
// jFrame.add(jbt);
/*
//添加两个弹簧后,或许你会认为不需要再放大就能看见了,但是很遗憾,仍需要放大,然后才能看见按钮,你会发现它居上方中央
jFrame.add(jPanel);
SpringLayout springLayout = new SpringLayout() ;
jPanel.setLayout( springLayout );//可看见按钮//注意:BoxLayout can't be shared//得用JPanel。。。不能直接用JFrame。。。
jPanel.add(jbt);
Spring spring = Spring.constant(0,10,20);
springLayout.putConstraint(SpringLayout.WEST, jbt, spring, SpringLayout.WEST, jPanel);
springLayout.putConstraint(SpringLayout.EAST, jPanel, spring, SpringLayout.EAST, jbt);
*/
/*
//再添加两个弹簧后,看看效果如何,发现看得见按钮了,而且不论放大与否,都是居中显示
jFrame.add(jPanel);
SpringLayout springLayout = new SpringLayout() ;
jPanel.setLayout( springLayout );//可看见按钮//注意:BoxLayout can't be shared//得用JPanel。。。不能直接用JFrame。。。
jPanel.add(jbt);
Spring spring = Spring.constant(0,10,20);
springLayout.putConstraint(SpringLayout.WEST, jbt, spring, SpringLayout.WEST, jPanel);
springLayout.putConstraint(SpringLayout.EAST, jPanel, spring, SpringLayout.EAST, jbt);
springLayout.putConstraint(SpringLayout.NORTH, jbt, spring, SpringLayout.NORTH, jPanel);
springLayout.putConstraint(SpringLayout.SOUTH, jPanel, spring, SpringLayout.SOUTH, jbt);
*/
/*
//再set一下frame size,注意要把后面的pack语句暂时注释掉,再来看看效果如何,size变化了,而且不论放大与否,都是居中显示
jFrame.setSize(1000,618);
jFrame.add(jPanel);
SpringLayout springLayout = new SpringLayout() ;
jPanel.setLayout( springLayout );//可看见按钮//注意:BoxLayout can't be shared//得用JPanel。。。不能直接用JFrame。。。
jPanel.add(jbt);
Spring spring = Spring.constant(0,10,20);
springLayout.putConstraint(SpringLayout.WEST, jbt, spring, SpringLayout.WEST, jPanel);
springLayout.putConstraint(SpringLayout.EAST, jPanel, spring, SpringLayout.EAST, jbt);
springLayout.putConstraint(SpringLayout.NORTH, jbt, spring, SpringLayout.NORTH, jPanel);
springLayout.putConstraint(SpringLayout.SOUTH, jPanel, spring, SpringLayout.SOUTH, jbt);
*/
//jFrame.setLayout(new GridBagLayout());//可看见按钮
//jFrame.add(jbt);
// jFrame.setLayout(new CardLayout());//可看见按钮,居中显示,而且不论放大与否,都会占据所有空间
//jFrame.add(jbt, "1");
//jFrame.add(jPanel);
//jPanel.setLayout(new BoxLayout(jPanel,BoxLayout.X_AXIS));//可看见按钮//注意:BoxLayout can't be shared//得用JPanel。。。不能直接用JFrame。。。
//jPanel.add(jbt);//居左显示,放大后居左而且占中间显示
// jFrame.add(jPanel);
// jPanel.setLayout(new OverlayLayout(jPanel) );//可看见按钮//注意:OverlayLayout can't be shared//得用JPanel。。。不能直接用JFrame。。。
// jPanel.add(jbt);//效果竟然同上,很意外
jFrame.pack();
jFrame.setVisible(true);//don't forget!
}
public static void main(String[] args) {
// TODO code application logic here
Main main = new Main();
}
}