Java 绘制随机图形

题目:

定义4个类,MyShape、MyLine、MyRectangle和MyOval,其中MyShape是其他三个类的父类。MyShape为抽象类,包括图形位置的四个坐标;一个无参的构造方法,将所有的坐标设置为0;一个带参的构造函数,将所有的坐标设置为相应值;每个坐标的设置和读取方法;abstract void draw(Graphics g)方法。MyLine类负责画直线,实现父类的draw方法;MyRectangle负责画矩形,实现父类的draw方法;MyOval负责画椭圆,实现父类的draw方法。编写一个应用程序,使用上面定义的类,随机选取位置和形状,绘制20个图形。

思路: 

  1. JFrame在框架中填入一个或多个组件时,如果只用他们的首选大小可以用pack()方法而不是setSize方法,用setSize方法就不用第三步JComponent设定;
  2. super()在这里调用了父类MyShape的含参构造方法;
  3. 一开始我创造出来的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()));
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhi non

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值