尝试使用 paintComponent 绘制一个圆
Trying to draw a circle using paintComponent
我正在做一个作业,我创建了一个 GUI,在上面画了一个圆圈或一个脸,并为用户提供了在他们单击按钮时更改面部特征的选项,我已经完成了基本布局,但现在我想在我的 GUI 的主面板中画一个圆圈,我创建了另一个扩展 JPanel
的文件,我创建了 paintComponent
方法并在主应用程序上调用它,但它不会得到一个圆圈,而是会在主面板的顶部有一个小正方形,我已经尝试过大小但无论我改变什么仍然会给我同样的东西,我不知道如果我能得到一些帮助我会错过什么感谢它和一些建议..提前谢谢你
这是我的 JPanel 主应用程序
public class FaceApp extends JFrame {
/**
*
*/
JPanel panel,mainPanel;
Graphics graph;
public static void main(String[] args) {
FaceApp frame = new FaceApp();
frame.setVisible(true);
frame.setBackground(Color.BLUE);
frame.setSize(1000,1000);
frame.setResizable(false);
}
private FaceApp() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Face");
panel = new JPanel(new GridLayout(16,1,1,1));
panel.setBorder(new EmptyBorder(30,30,100,100));
mainPanel = new JPanel();
JCheckBox eyes = new JCheckBox("Eyes");
JCheckBox noes = new JCheckBox("Nose");
JCheckBox mouth = new JCheckBox("Mouth");
JLabel label = new JLabel();
JButton update = new JButton("update");
label.setText("You choose..");
panel.add(label);
panel.add(eyes);
panel.add(noes);
panel.add(mouth);
panel.add(update);
Face face = new Face();
mainPanel.setBackground(Color.BLUE);
mainPanel.add(face);
add(mainPanel,BorderLayout.CENTER);
add(panel, BorderLayout.WEST);
}
}
这是画画的 Face
class:
public class Face extends JPanel{
/**
*
*/
public Face(){
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(20, 30, 150, 150);
g.setColor(Color.red);
}
}
mainPanel.add(face);
您正在将面部组件添加到使用 FlowLayout 的面板。 FlowLayout 尊重添加到它的任何组件的首选大小。在您的情况下,首选大小为 (0, 0),因此布局管理器无法正常工作。
您需要将 class 的 getPreferredSize()
方法重写为 return 组件的首选大小,在您的情况下可能是 (190, 210) 所以椭圆在面板中居中。
您可以阅读 Swing 教程中关于 Custom Painting 的部分,以获取演示如何实现此方法的工作示例。随身携带 link 本教程,因为它包含许多 Swing 基础知识的示例。
我正在做一个作业,我创建了一个 GUI,在上面画了一个圆圈或一个脸,并为用户提供了在他们单击按钮时更改面部特征的选项,我已经完成了基本布局,但现在我想在我的 GUI 的主面板中画一个圆圈,我创建了另一个扩展 JPanel
的文件,我创建了 paintComponent
方法并在主应用程序上调用它,但它不会得到一个圆圈,而是会在主面板的顶部有一个小正方形,我已经尝试过大小但无论我改变什么仍然会给我同样的东西,我不知道如果我能得到一些帮助我会错过什么感谢它和一些建议..提前谢谢你
这是我的 JPanel 主应用程序
public class FaceApp extends JFrame {
/**
*
*/
JPanel panel,mainPanel;
Graphics graph;
public static void main(String[] args) {
FaceApp frame = new FaceApp();
frame.setVisible(true);
frame.setBackground(Color.BLUE);
frame.setSize(1000,1000);
frame.setResizable(false);
}
private FaceApp() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Face");
panel = new JPanel(new GridLayout(16,1,1,1));
panel.setBorder(new EmptyBorder(30,30,100,100));
mainPanel = new JPanel();
JCheckBox eyes = new JCheckBox("Eyes");
JCheckBox noes = new JCheckBox("Nose");
JCheckBox mouth = new JCheckBox("Mouth");
JLabel label = new JLabel();
JButton update = new JButton("update");
label.setText("You choose..");
panel.add(label);
panel.add(eyes);
panel.add(noes);
panel.add(mouth);
panel.add(update);
Face face = new Face();
mainPanel.setBackground(Color.BLUE);
mainPanel.add(face);
add(mainPanel,BorderLayout.CENTER);
add(panel, BorderLayout.WEST);
}
}
这是画画的 Face
class:
public class Face extends JPanel{
/**
*
*/
public Face(){
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(20, 30, 150, 150);
g.setColor(Color.red);
}
}
mainPanel.add(face);
您正在将面部组件添加到使用 FlowLayout 的面板。 FlowLayout 尊重添加到它的任何组件的首选大小。在您的情况下,首选大小为 (0, 0),因此布局管理器无法正常工作。
您需要将 class 的 getPreferredSize()
方法重写为 return 组件的首选大小,在您的情况下可能是 (190, 210) 所以椭圆在面板中居中。
您可以阅读 Swing 教程中关于 Custom Painting 的部分,以获取演示如何实现此方法的工作示例。随身携带 link 本教程,因为它包含许多 Swing 基础知识的示例。