JavaAwtSwing的JFrame的pack()方法,容器适配子组件大小,笔记231220
2023-12-21 00:38:53
pack()
是extends自Window类的方法
使此窗口的大小适合其子组件的首选大小和布局。如果其中一个尺寸小于上一次调用setMinimumSize方法指定的最小尺寸,则会自动放大窗口的宽度和高度。
如果窗口和/或其所有者还不可显示,则在计算首选大小之前,将使它们都可显示。在计算窗口的大小后对其进行验证。
@SuppressWarnings("deprecation")
public void pack() {
Container parent = this.parent;
if (parent != null && parent.peer == null) {
parent.addNotify();
}
if (peer == null) {
addNotify();
}
Dimension newSize = getPreferredSize();
if (peer != null) {
setClientSize(newSize.width, newSize.height);
}
if(beforeFirstShow) {
isPacked = true;
}
validateUnconditionally();
}
例1 , 外容器会变成子组件的大小
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Pack测试231219 {
public static JFrame frame = new JFrame(Thread.currentThread().getStackTrace()[1].getClassName());
static{
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
System.exit(0);
}
});
frame.setBounds(100,100,1024,768);
}
static void init() {
}
static void step1() {
int sleep = 3000;
JLabel jlb = new JLabel("""
<html>
<style>
#div001{ padding:100px 50px; }
.c1{font-size:16px; color:blue;}
</style>
<div id="div001" style="background:red; ">
"""
+
"<center class=c1 >"+sleep+"毫秒后</center>"
+
"<center class=c1 >"+"调用frame.pack()"+"</center>"
+
"""
</div>
</html>
""");
jlb.setOpaque(true);
jlb.setBackground(Color.DARK_GRAY);
jlb.setHorizontalAlignment(JLabel.CENTER);
jlb.setVerticalAlignment(JLabel.CENTER);
frame.add(jlb, BorderLayout.CENTER);
try {
frame.setVisible(true);
Thread.sleep(sleep);
frame.pack();
}catch(Exception ex) {
ex.printStackTrace();
}
}
static void step2() {
}
public static void main(String[] arguments)throws Exception {
init(); step1(); step2 ();
}
}
效果
例2 , 如果子组件设置了 setPreferredSize() , 外容器会变成子组件setPreferredSize()的大小
这个例子中jlb.setPreferredSize(new Dimension(600,600));
jlb.setSize()无效
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Pack测试231220 {
public static JFrame frame = new JFrame(Thread.currentThread().getStackTrace()[1].getClassName());
static{
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
System.exit(0);
}
});
frame.setBounds(100,100,1024,768);
}
static void init() {
}
static void step1() {
int sleep = 3000;
JLabel jlb = new JLabel("""
<html>
<style>
#div001{ padding:100px 50px; }
.c1{font-size:16px; color:blue;}
</style>
<div id="div001" style="background:red; ">
"""
+
"<center class=c1 >"+sleep+"毫秒后</center>"
+
"<center class=c1 >"+"调用frame.pack()"+"</center>"
+
"""
</div>
</html>
""");
jlb.setOpaque(true);
jlb.setBackground(Color.DARK_GRAY);
jlb.setHorizontalAlignment(JLabel.CENTER);
jlb.setVerticalAlignment(JLabel.CENTER);
frame.add(jlb, BorderLayout.CENTER);
try {
frame.setVisible(true);
Thread.sleep(sleep);
jlb.setPreferredSize(new Dimension(600,600));
frame.pack();
}catch(Exception ex) {
ex.printStackTrace();
}
}
static void step2() {
}
public static void main(String[] arguments)throws Exception {
init(); step1(); step2 ();
}
}
文章来源:https://blog.csdn.net/kfepiza/article/details/135109955
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!