在java中如何在按下按钮时绘制正方形

在java中如何在按下按钮时绘制正方形,java,swing,drawing,paintcomponent,repaint,Java,Swing,Drawing,Paintcomponent,Repaint,我正在编写一个java程序,输入一个矩形的长度和宽度,然后输出周长和面积。但是现在,我也想画这个图形。但我不知道按下按钮时怎么画。应该是这样吗 public void paintComponent(Graphics g) { paintComponent(g); g.setColor(Color.blue); g.drawRect(10, 10, 80, 30); } public void actionPerformed(ActionEvent e) {

我正在编写一个java程序,输入一个矩形的长度和宽度,然后输出周长和面积。但是现在,我也想画这个图形。但我不知道按下按钮时怎么画。应该是这样吗

public void paintComponent(Graphics g) {
    paintComponent(g);
    g.setColor(Color.blue);
    g.drawRect(10, 10, 80, 30);      
}

public void actionPerformed(ActionEvent e) {
    paintComponent();
}
因为当我这样做的时候,它会给我一个错误,说:

method paintComponent in class Rectangles cannot be applied to given types;
required: Graphics
found: no arguments

所以我真的不知道该怎么办。

不,你不应该直接调用
paintComponent
。无论如何,该方法都将自动调用,因此在单击之前将绘制正方形

您可以使用布尔标志指示单击按钮并调用
repaint()
发布重新绘制请求:

boolean clicked = false;

public void paintComponent(Graphics g) {
    if (clicked) {
        g.setColor(Color.blue);
        g.drawRect(10, 10, 80, 30);
    }
}

public void actionPerformed(ActionEvent e){
    clicked = true;
    repaint();
}
此外,从不让方法使用完全相同的参数调用自己。这个剪掉了

public void paintComponent(Graphics g) {
    paintComponent(g);
将无限频繁地调用同一函数(或直到堆栈已满)

我想你在某处看到了以下情况:

public void paintComponent(Graphics g) {
    super.paintComponent(g);

好的,它将调用超类的paint方法。它可能不起任何作用,所以省略它应该不会有什么坏处(但保留它也不会有坏处)。

不,您不应该直接调用
paintComponent
。无论如何,该方法都将自动调用,因此在单击之前将绘制正方形

您可以使用布尔标志指示单击按钮并调用
repaint()
发布重新绘制请求:

boolean clicked = false;

public void paintComponent(Graphics g) {
    if (clicked) {
        g.setColor(Color.blue);
        g.drawRect(10, 10, 80, 30);
    }
}

public void actionPerformed(ActionEvent e){
    clicked = true;
    repaint();
}
此外,从不让方法使用完全相同的参数调用自己。这个剪掉了

public void paintComponent(Graphics g) {
    paintComponent(g);
将无限频繁地调用同一函数(或直到堆栈已满)

我想你在某处看到了以下情况:

public void paintComponent(Graphics g) {
    super.paintComponent(g);

好的,它将调用超类的paint方法。它可能没有任何作用,所以省略它应该没有坏处(但保留它也没有坏处)。

谢谢,但当我这样做时,它会给我一个
java.lang.StackOverflowerError
。我不知道为什么。@DLJ我没有明确说明,但我删除了对
paintComponent(g)的调用来自
paintComponent
。您也应该这样做:)(或者将其作为
super.paintComponent(g)
)@DLJ:尝试重写并使其返回一些有效的
维度
对象,就像您重写
paintComponent(…)
方法一样,例如,谢谢。但当我这样做时,它会给我一个
java.lang.StackOverflowError
。我不知道为什么。@DLJ我没有明确说明,但我删除了对
paintComponent(g)的调用来自
paintComponent
。您应该执行相同的操作:)(或者将其作为
super.paintComponent(g)
)@DLJ:尝试重写并使其返回一些有效的
维度
对象,就像重写
paintComponent(…)
方法一样,例如。