传递给 paint(Graphics) 函数的值是什么? (AWT)

What value to pass the paint(Graphics) function? (AWT)

我正在尝试使用 AWT 进行一些简单的 GUI 操作。 我现在遇到的问题是如何调用绘画函数(我正在尝试为每个 shape/object 创建一个方法)。我根本无法通过阅读 API 来判断 "Graphics" 指的是什么参数,我需要在调用时传递该函数。看其他的例子,感觉连具体调用都不需要。我很困惑..

此外,是否可以将实际对象中的值传递给 drawRect(int ... int) 函数,或者我必须求助于硬编码值,即现在在范围内定义的方式?

import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics.*;

class AWTFigur extends Panel{
Figur f;

AWTFigur (Figur f){
        this.f = f;
}

public void paint(Graphics g){
    f.paint(g);
}

public Dimension getPreferredSize(){
    return new Dimension (f.getWidth()+2, f.getHeight()+2);
}

public void paintRect(Graphics g){
    super.paint(g);
    g.drawRect(0, 0, 10, 10);

}


public static void main(String args[]){
    Frame F=new Frame();
    F.setLayout(new FlowLayout());
    F.addWindowListener(new WindowAdapter()
        {public void windowClosing(WindowEvent we){System.exit(0);}});
    AWTFigur P1=new AWTFigur(new Square(Integer.parseInt(args[0])));
    F.add(P1);
    AWTFigur P2=new AWTFigur(new Circle(Integer.parseInt(args[1])));
    F.add(P2);
    F.pack();
    F.setVisible(true);

}

}

圆的代码位class:

public class Circle extends Figur{
private int radius;
private int diameter;
private final double pi = 3.14159265358979323846264338327950288419;

public Circle(int radius){
    if (radius>0)
        this.radius=radius;
    else{
        this.radius=2;
    }
}

@Override
double getCircumference(){
    return (this.radius*this.pi*2);
}

@Override
double getArea(){
    return this.pi*this.radius*this.radius;
}

int getRadius(){
    return this.radius;
}

int getDiameter(){
    return this.diameter;
}

void setRadius(int radius){
    if (radius > 0)
        this.radius=radius;
    else{
        this.radius=2;
    }
}

void setDiameter(int diameter){
    if (diameter == (radius*2))
        this.diameter=diameter;
    else{
        this.diameter=radius*2;
    }
}

}

对于正方形 class:

public class Square extends Figur{
private int height;
private int width;

public Square(int height){
    if (height >0){
        this.height=height;
        this.width=height;
    }
    else{
        this.height=2;
        this.width=2;
    }
}

@Override
double getCircumference(){
    return this.height*4;
}

@Override
double getArea(){
    return this.width*2;
}


@Override
int getHeight(){
    return this.height;
}

@Override
int getWidth(){
    return this.width;
}

void setHeight(int height){
    if (height > 0)
        this.height=height;
    else{
        this.height=2;
    }
}

void setWidth(int width){
    if (width > 0)
        this.width=width;
    else{
        this.width=2;
    }
}

}

和超class图:

 import java.awt.*;

class Figur{
double getCircumference(){return 0;}
double getArea(){return 0;}
int getHeight(){return 0;}
int getWidth(){return 0;}
public void paint(Graphics g){}
}

What value to pass the paint(Graphics) function? (AWT)

正如你后面的话所暗示的,你没有。只需调用 repaint(),AWT/Swing 的 GUI 工具包将确保使用有效的 Graphics 实例调用 paint(Graphics) 方法。

Also, is it possible to pass the drawRect(int ... int) function the values in my actual object, or do I have to resort to hard coded values, the way it is defined in scope right now?

第一个class有这个:

class AWTFigur extends Panel{
Figur f;

这里,f是class类型Figure的一个属性,一个class指定了一个方法public void paint(Graphics g){},可以是被任何扩展它的 class 覆盖。 (但如果它是 interfaceabstract class 会更好 - 原因是任何其他实现或扩展它的 class 是 forced 提供一个实现。)所以在后一种情况下,CircleSquare 都会有一个可以被任何 class 调用的绘画方法(例如AWTFigur) 具有该类型的对象,当它想要/需要绘制该对象时。

鉴于 class 有:

,您似乎对此(至少)有一个微弱的理解
public void paint(Graphics g){
    f.paint(g);
} 

这将导致 Figure 被绘制。但是 main(..) 方法表明您的理解似乎有点模糊。

Frame F=new Frame();
F.setLayout(new FlowLayout());
F.addWindowListener(new WindowAdapter()
    {public void windowClosing(WindowEvent we){System.exit(0);}});
AWTFigur P1=new AWTFigur(new Square(Integer.parseInt(args[0])));
F.add(P1);
AWTFigur P2=new AWTFigur(new Circle(Integer.parseInt(args[1])));
F.add(P2);

这会将 AWTFigur 的两个实例添加到具有(默认)BorderLayout 的框架。 Component(如 Panel)只能添加到 BorderLayout 单个 约束。因为添加时没有指定约束,所以它们都会被添加到CENTER(只能显示其中一个)。

这不是这里需要的。

需要的是 AWTFigur 的单个实例,它可以绘制任意数量的 Figure 对象,因此打开代码可能会更改为:

class AWTFigur extends Panel{
ArrayList<Figur> f;

ArrayList 可以容纳 多个 Figur 个对象。如果那么,除了(或者可能不是)接受 Figur 对象的构造函数之外,class 还提供了如下方法:

public void addFigur(Figur figur) {
    f.addElement(figur); // add the new Figur to the existing collection
    repaint(); // schedule a call to paint(Graphics)
}

可以在 main(..) 中调用该方法以将第二个或第三个图形添加到数组列表所保存的集合中。

那么在paint方法中,就可以遍历整个集合,依次绘制。类似于:

public void paint(Graphics g){
    for (Figure figur : f) {
        g.paint(g);
    }
}

这类内容将在 Performing Custom Painting 中介绍。认真看课,看例子,每一个都试一试,完成后应该就清楚多了。

最后一条(或两条):

  1. 请学习常见的 Java 命名法(命名约定 - 例如 EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它.
  2. 为什么要使用 AWT?请参阅 this answer 以了解放弃 AWT 组件以支持 Swing 的许多充分理由。
  3. private final double pi = 3.14159265358979323846264338327950288419; 改用,Math.PI