Java `pack()`和`setLayout()的问题`
我有密码Java `pack()`和`setLayout()的问题`,java,swing,graphics,flowlayout,Java,Swing,Graphics,Flowlayout,我有密码 import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Graphics; import java.awt.FlowLayout; class GUI extends JFrame { JPanel mainPanel; public GUI(String header) { super(header); setDefaultCloseOpera
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.FlowLayout;
class GUI extends JFrame {
JPanel mainPanel;
public GUI(String header) {
super(header);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//setLayout(new FlowLayout(FlowLayout.CENTER));
init();
add(mainPanel);
pack();
}
public void init() {
mainPanel = new JPanel(){
@Override
public void paintComponent(Graphics g) {
g.fillOval(0, 0, 50, 50);
}
};
}
}
我的主要方法是
GUI progam = new GUI("Title");
progam.setLocationRelativeTo(null);
progam.setVisible(true);
如果我运行程序,我会得到输出:
如果我取消注释setLayout
,我会得到以下输出:
两个问题:
pack()
不能按预期工作?我不应该看到整个圆圈而不是它的一半吗mainPanel
没有为布局管理器提供大小提示,因此它使用组件的默认大小提示(0x0)
加
在您进行任何自定义绘制之前,请向您的mainPanel
和super.paintComponent(g)
发送到您的paintComponent
方法
为什么在第二次输出中椭圆形变成三角形
这就是BorderLayout
和FlowLayout
为什么在第一种情况下pack()不能按预期工作?我不应该看到整个圆圈而不是它的一半吗
是的,mainPanel
没有为布局管理器提供大小提示,因此它使用组件的默认大小提示(0x0)
加
在您进行任何自定义绘制之前,请向您的mainPanel
和super.paintComponent(g)
发送到您的paintComponent
方法
为什么在第二次输出中椭圆形变成三角形
这就是BorderLayout
和FlowLayout
为什么在第一种情况下pack()不能按预期工作?我不应该看到整个圆圈而不是它的一半吗
是的,mainPanel
没有为布局管理器提供大小提示,因此它使用组件的默认大小提示(0x0)
加
在您进行任何自定义绘制之前,请向您的mainPanel
和super.paintComponent(g)
发送到您的paintComponent
方法
为什么在第二次输出中椭圆形变成三角形
这就是BorderLayout
和FlowLayout
为什么在第一种情况下pack()不能按预期工作?我不应该看到整个圆圈而不是它的一半吗
是的,mainPanel
没有为布局管理器提供大小提示,因此它使用组件的默认大小提示(0x0)
加
在您进行任何自定义绘制之前,请向您的mainPanel
和super.paintComponent(g)
发送到您的paintComponent
方法
为什么在第二次输出中椭圆形变成三角形
这就是
BorderLayout
和FlowLayout
之间的区别,当您在JPanel中绘制时,实际上没有将组件放在其中,因此它没有任何尺寸(宽度、高度)以及JPanel
如此处所述,第4项:
包装方法调整框架尺寸,使其所有内容物都达到或超过其首选尺寸。pack的另一种方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。一般来说,使用pack比调用setSize更可取,因为pack让框架布局管理器负责框架大小,而布局管理器擅长根据平台依赖性和影响组件大小的其他因素进行调整。
要解决此问题,请使用setBounds
或setSize
或添加具有首选尺寸的组件
希望它有帮助=)当您在JPanel中绘制时,您实际上没有在其中放置组件,因此它没有任何尺寸(宽度、高度)以及JPanel 如此处所述,第4项: 包装方法调整框架尺寸,使其所有内容物都达到或超过其首选尺寸。pack的另一种方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。一般来说,使用pack比调用setSize更可取,因为pack让框架布局管理器负责框架大小,而布局管理器擅长根据平台依赖性和影响组件大小的其他因素进行调整。 要解决此问题,请使用
setBounds
或setSize
或添加具有首选尺寸的组件
希望它有帮助=)当您在JPanel中绘制时,您实际上没有在其中放置组件,因此它没有任何尺寸(宽度、高度)以及JPanel 如此处所述,第4项: 包装方法调整框架尺寸,使其所有内容物都达到或超过其首选尺寸。pack的另一种方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。一般来说,使用pack比调用setSize更可取,因为pack让框架布局管理器负责框架大小,而布局管理器擅长根据平台依赖性和影响组件大小的其他因素进行调整。 要解决此问题,请使用
setBounds
或setSize
或添加具有首选尺寸的组件
希望它有帮助=)当您在JPanel中绘制时,您实际上没有在其中放置组件,因此它没有任何尺寸(宽度、高度)以及JPanel 如此处所述,第4项: 包装方法调整框架尺寸,使其所有内容物都达到或超过其首选尺寸。pack的另一种方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。通常,使用pack比调用setSize更可取,因为pack让框架布局管理器负责框架大小,而布局管理器擅长调整以适应平台de
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}