我有代码
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()
在第一种情况下没有按预期工作?我不应该看到完整的圆圈而不是看到它的一半吗?答案 0 :(得分:2)
为什么pack()在第一种情况下没有按预期工作?我不应该看到完整的圆圈而不是看到它的一半吗?
是的,你的mainPanel
没有为布局管理器提供任何大小调整提示,因此它正在使用它的组件的默认大小提示(0x0)
添加
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
在进行任何自定义绘画之前, mainPanel
和super.paintComponent(g)
到paintComponent
方法
为什么椭圆形在第二个输出中变成三角形?
这将是BorderLayout
和FlowLayout
答案 1 :(得分:1)
当您在JPanel中绘图时,实际上并没有在其中放置组件,因此它没有任何尺寸(宽度,高度)以及JPanel。
如此处https://docs.oracle.com/javase/tutorial/uiswing/components/frame.html所示,第4项:
pack方法调整框架的大小,使其所有内容都达到或超过其首选大小。 pack的替代方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。通常,使用pack比调用setSize更好,因为pack离开框架布局管理器负责框架大小,布局管理器擅长调整平台依赖性和影响组件大小的其他因素。
要解决此问题,请使用setBounds
或setSize
或添加首选尺寸的组件。
希望有帮助=)