题目:
定义4个类,MyShape、MyLine、MyRectangle和MyOval,其中MyShape是其他三个类的父类。MyShape为抽象类,包括图形位置的四个坐标;一个无参的构造方法,将所有的坐标设置为0;一个带参的构造函数,将所有的坐标设置为相应值;每个坐标的设置和读取方法;abstract void draw(Graphics g)方法。MyLine类负责画直线,实现父类的draw方法;MyRectangle负责画矩形,实现父类的draw方法;MyOval负责画椭圆,实现父类的draw方法。编写一个应用程序,使用上面定义的类,随机选取位置和形状,绘制20个图形。
思路:
- JFrame在框架中填入一个或多个组件时,如果只用他们的首选大小可以用pack()方法而不是setSize方法,用setSize方法就不用第三步JComponent设定;
- super()在这里调用了父类MyShape的含参构造方法;
- 一开始我创造出来的JComponent没有出现,原因是没给JComponent设窗口大小,固定格式:
public static final int X=800;//宽 public static final int Y=800;//高 public Dimension getPreferredSize() { return new Dimension(X,Y); }
import javax.swing.*;
import java.awt.*;
import java.util.Random;
import java.awt.geom.*;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(()->{
JFrame frame=new DrawGraphics();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
);
}
}
class DrawGraphics extends JFrame {
public DrawGraphics(){
add(new DrawComponent());
pack();
}
}
class DrawComponent extends JPanel {
public static final int X=800;
public static final int Y=800;
public void paintComponent(Graphics g){
super.paintComponent(g);//JPanel是不透明的,重写paintComponent(),想要把之前的东西显示,就要调用super.paintComponent()。否则会覆盖之前的
MyShape s;
Random rand=new Random();
for (int i=0;i<20;i++){
int k=rand.nextInt(3);
int x=rand.nextInt(400);
int y=rand.nextInt(400);
int w=rand.nextInt(400);
int h=rand.nextInt(400);
switch (k){
case 0:
s=new MyLine(x,y,w,h);
s.draw(g);
case 1:
s=new MyOval(x,y,w,h);
s.draw(g);
case 2:
s=new MyRectangle(x,y,w,h);
s.draw(g);
}
}
}
public Dimension getPreferredSize() {
return new Dimension(X,Y);
}
}
abstract class MyShape {
int x,y,w,h;
public MyShape(){
this.h=0;
this.w=0;
this.x=0;
this.y=0;
}
public MyShape(int x,int y,int w,int h){
this.w=w;
this.h=h;
this.x=x;
this.y=y;
}
public void setH(int h) {
this.h = h;
}
public void setW(int w) {
this.w = w;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public int getH() {
return h;
}
public int getW() {
return w;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public abstract void draw(Graphics g);
}
class MyOval extends MyShape{
public MyOval(int x,int y,int w,int h){
super(x,y,w,h);
}
@Override
public void draw(Graphics g) {
Graphics2D g2=(Graphics2D) g;
g2.draw(new Ellipse2D.Double(x,y,w,h));
}
}
class MyRectangle extends MyShape{
public MyRectangle(int x,int y,int w,int h){
super(x,y,w,h);
}
@Override
public void draw(Graphics g) {
Graphics2D g2=(Graphics2D) g;
g2.draw(new Rectangle2D.Double(x,y,w,h));
}
}
class MyLine extends MyShape{
public MyLine(int x,int y,int w,int h){
super(x,y,w,h);
}
@Override
public void draw(Graphics g) {
Graphics2D g2=(Graphics2D) g;
g2.draw(new Line2D.Double(getX(),getY(),getW(),getH()));
}
}