我试图用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){}
}
答案 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){}
的类,任何可以扩展它的类都可以覆盖它。 (但如果它是interface
或abstract
类会更好 - 原因是任何其他实现或扩展它的类都是强制来提供实现。)所以在后一种情况下,Circle
和Square
都有一个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中介绍。仔细阅读课程,通过示例并尝试每一个,一旦完成,它应该更加清晰。
最后一个注释(或两个):
EachWordUpperCaseClass
,firstWordLowerCaseMethod()
,firstWordLowerCaseAttribute
,除非它是UPPER_CASE_CONSTANT
)并一致地使用它。 private final double pi = 3.14159265358979323846264338327950288419;
使用Math.PI