【发布时间】:2013-04-01 19:15:41
【问题描述】:
为什么在JFrame 上调用pack() 时,getPreferredSize() 只被调用两次,如下例所示:
public class PackTest {
static JFrame f = new JFrame();
@SuppressWarnings("serial")
public static void main(String[] args) {
f.add(new JPanel() {
int i = 0;
@Override
public Dimension getPreferredSize() {
System.out.println("getPreferredSize() called");
if(i++ >= 2)
return new Dimension(200, 200); // This is never returned
else
return new Dimension(100, 100);
}
});
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
for(int i = 0; i < 10; i++) {
try {
TimeUnit.SECONDS.sleep(1);
} catch(InterruptedException e) {}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println("Calling pack()");
f.pack();
}
});
}
}
}
似乎getPreferredSize() 只在它不断返回不同的东西时才被调用(即,如果它每次返回不同的维度,在示例中它将被调用 10 次)。为什么 Swing 会这样做,我如何让 pack() 正确调整 JFrame 的大小?
【问题讨论】:
标签: java swing jframe jpanel preferredsize