传递paint(Graphics)函数的值是多少? (AWT)

时间:2018-04-16 18:41:48

标签: java user-interface graphics awt paint

我试图用AWT围绕一些简单的GUI操作。 我现在所处的观点是如何调用绘制函数(我试图为每个形状/对象创建一个方法)。我只是不能通过阅读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);

}

}

圆圈类的代码位:

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;
    }
}

}

对于方形班:

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;
    }
}

}

和超类Figur:

 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){}
}

1 个答案:

答案 0 :(得分:1)

  

传递paint(Graphics)函数的值是多少? (AWT)

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

  

另外,是否可以将drawRect(int ... int)函数传递给我的实际对象中的值,或者我是否必须求助于硬编码值,就像它现在在作用域中定义的那样?

第一堂课有:

class AWTFigur extends Panel{
Figur f;

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

鉴于班级有:

,你似乎对此至少有一种了解(至少)
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对象的构造函数之外,该类提供了这样的方法:

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