java.awt.Graphics

本文介绍了一种基于Java实现的图形绘制与窗口设计方法,包括直线、椭圆和长方形的绘制,以及相应的属性获取。通过窗口内的按钮交互,用户可以轻松选择不同的图形并进行随机属性设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线

package com.even.shape;

import java.awt.Graphics;

public class Line extends Shape {

    @Override
    public void draw(Graphics g) {
        g.setColor(Color);
        g.drawLine(starx, stary, endx, endy);

    }
     public int getLength(){
            return   (int) Math.sqrt((getStarx() - getEndx())
                    * (getStarx() - getEndx())
                    + (getStary() - getEndy())
                    * (getStary() - getEndy()));
        }

}

椭圆

package com.even.shape;

import java.awt.Graphics;

public class Oval extends Shape {

    @Override
    public void draw(Graphics g) {
        g.setColor(Color);
        int width = Math.abs(endx - starx);    //横坐标的绝对值
        int height = Math.abs(endy - stary);   //纵坐标的绝对值

        int x = starx < endx? starx : endx;    
        int y = stary < endy? stary : endy;

        g.drawOval(x, y, width, height);

    }
     public int getArea() {
            int width = Math.abs(endx - starx);
            int height = Math.abs(endy - stary);
            return (int) (Math.PI * width / 2 * height / 2);
        }
     public int getPerimeter() {
            int width = Math.abs(endx - starx);
            int height = Math.abs(endy - stary);
            width = (width > height ? width : height);
            height = (width < height ? width : height);
            return (int) (2 * Math.PI * height / 2 + 4 * (width / 2 - height / 2));
        }

}

长方形

package com.even.shape;

import java.awt.Graphics;

public class Rectangle extends Shape {

    @Override
    public void draw(Graphics g) {
        g.setColor(Color);
        int width = Math.abs(endx - starx);    //横坐标的绝对值
        int height = Math.abs(endy - stary);   //纵坐标的绝对值

        int x = starx < endx? starx : endx;    
        int y = stary < endy? stary : endy;

        g.drawRect(x, y, width, height);

    }
     public int getArea() {
            int width = Math.abs(endx - starx);
            int height = Math.abs(endy - stary);
            return width * height;
        }
     public int getPerimeter() {
            int width = Math.abs(endx - starx);
            int height = Math.abs(endy - stary);
            return 2 * (width + height);
        }

}

超类图形


package com.even.shape;

import java.awt.Color;
import java.awt.Graphics;

/**
 * 图形  (抽象类,不能实例化)
 */
public abstract class Shape {
    protected int starx;    //起点横坐标
    protected int stary;    //类推
    protected int endx;
    protected int endy;

    protected Color Color;  //颜色

    public Color getColor() {
        return Color;
    }

    public void setColor(Color color) {
        Color = color;
    }

    /**
     * 抽象方法(留给子类去实现)
     * @param g 画笔
     */
    public abstract void draw(Graphics g);

    public int getStarx() {
        return starx;
    }

    public void setStarx(int starx) {
        this.starx = starx;
    }

    public int getStary() {
        return stary;
    }

    public void setStary(int stary) {
        this.stary = stary;
    }

    public int getEndx() {
        return endx;
    }

    public void setEndx(int endx) {
        this.endx = endx;
    }

    public int getEndy() {
        return endy;
    }

    public void setEndy(int endy) {
        this.endy = endy;
    }
}


我的窗口设计

package com.even.ui;

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

import com.even.shape.Line;
import com.even.shape.Oval;
import com.even.shape.Rectangle;
import com.even.shape.Shape;
import com.even.util.MyUtil;

@SuppressWarnings("serial")
public class Myframe extends JFrame {
    private class ButtonHandler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            String command = e.getActionCommand();
            if(command.equals("Line")){
                shape = new Line();
            }
            else if(command.equalsIgnoreCase("Oval")) {
                shape = new Oval();
            }
            else{
                shape = new Rectangle();
            }

            shape.setStarx(MyUtil.random(1, 600));
            shape.setStary(MyUtil.random(1, 600));
            shape.setEndx(MyUtil.random(1, 600));
            shape.setEndy(MyUtil.random(1, 600));
            shape.setColor(MyUtil.randomColor());

            repaint();
             if (shape instanceof Line) {
                    str = "直线的长度" + ((Line) shape).getLength();

                } else if (shape instanceof Oval) {
                    str = "  椭圆的面积:" + ((Oval) shape).getArea()

                            + "  椭圆的周长为:" + ((Oval) shape).getPerimeter();

                } else {
                    str = "  矩形的面积:" + ((Rectangle) shape).getArea()

                            + "  矩形的周长为:" + ((Rectangle) shape).getPerimeter();
                }
        }

    }
    private JButton lineButton, ovalButton, rectButton;

    private Shape shape = null;
    private String str;

    public Myframe() {
        this.setTitle("绘制窗口"); // 窗口题目
        this.setSize(1000, 800); // 窗口尺寸
        this.setResizable(false); // 设置窗口大小不可改变
        this.setLocationRelativeTo(null); // 设置窗口的相对位置
        this.setDefaultCloseOperation(EXIT_ON_CLOSE); // 关掉窗口即结束程序

        lineButton = new JButton("Line");
        ovalButton = new JButton("Oval");
        rectButton = new JButton("Rectangle");

        ActionListener handler = new ButtonHandler();


        lineButton.addActionListener(handler);
        ovalButton.addActionListener(handler);
        rectButton.addActionListener(handler);



        this.setLayout(new FlowLayout());
        this.add(lineButton);
        this.add(ovalButton);
        this.add(rectButton);

    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        if (shape != null) {
            shape.draw(g);

            g.drawString(str, 300, 300);
        }

    }

}

我的工具包

package com.even.util;

/**
 * 我的工具空间
 */
import java.awt.Color;

public final class MyUtil { // 加个final,不让继承,成为终结类(断子绝孙类)

    private MyUtil() {      //禁止创建对象调用,  用只需类名 加“.”

    }

    /**
     * 产生指定范围的随机整数
     * 
     * @param min
     *            最小值(闭区间)
     * @param max
     *            最大值 (闭区间)
     * @return 指定范围的随机整数
     */
    public static int random(int min, int max) {
        return (int) (Math.random() * (max - min + 1) + min);
    }

    /**
     * 生成随机颜色
     * 
     * @return Color 对象
     */
    public static Color randomColor() {
        int r = random(0, 255);
        int g = random(0, 255);
        int b = random(0, 255);
        return new Color(r, g, b);
    }

}

我的窗口测试运行

package com.even.test;

import com.even.ui.Myframe;

public class MyFrameTest {

    public static void main(String[] args) {
        new Myframe().setVisible(true);
    }

}
<think>好的,用户想了解如何使用java.awt.Graphics。我需要先回忆一下这个类的基本功能和常见用法。首先,GraphicsAWT中用于绘制图形的抽象类,通常用于自定义组件的绘制,比如在paint()或paintComponent()方法中重写。 用户可能是刚开始学习Java图形界面编程,可能需要从基础讲起。我应该先介绍如何获取Graphics对象,通常是通过重写paint方法或者使用getGraphics()方法,但后者可能不太安全,需要注意。 接下来,需要说明常用的绘图方法,比如drawLine, drawRect, fillRect, drawOval, fillOval,还有设置颜色和字体。这些是基本操作,用户可能需要示例代码来理解。 然后,用户可能不知道需要在哪个地方调用这些方法,所以得提到自定义组件,比如继承JPanel并重写paintComponent方法,同时提醒调用super.paintComponent(g)来清空画布。 另外,双缓冲技术可能对动画有帮助,可以简单提一下。但用户的问题可能还没到那个阶段,不过可以作为高级技巧提到。 还要注意线程安全的问题,比如不要在非事件分派线程中调用绘图方法,避免使用getGraphics(),而是通过repaint()触发重绘。 最后,提供一个完整的示例代码,展示从创建窗口到绘制图形的整个过程,这样用户可以直接运行看到效果。同时,提醒使用Swing组件而不是AWT的Frame,因为Swing更现代,功能更强大。 需要确保步骤清晰,语言简洁,避免术语过多,但又要覆盖关键点。检查是否有遗漏,比如颜色设置、字体使用,以及处理重绘的正确方法。可能用户遇到的问题比如图形不显示,可能因为没有正确重写方法或没有调用父类方法,这些都要提到。</think>Java AWT中的`java.awt.Graphics`类是2D图形绘制的核心工具,主要用于自定义组件绘制。以下是分步使用指南: 一、基础使用步骤 1. 继承`JPanel`并重写`paintComponent`方法(Swing推荐做法) ```java public class MyPanel extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 必须首先调用父类方法 // 在此添加绘图代码 } } ``` 二、常用绘图方法 1. 基本形状绘制 ```java g.drawLine(10, 10, 50, 50); // 直线 g.drawRect(60, 60, 100, 80); // 空心矩形 g.fillRect(170, 60, 100, 80); // 实心矩形 g.drawOval(60, 150, 100, 100); // 空心圆形 ``` 2. 颜色设置 ```java g.setColor(Color.RED); // 预定义颜色 g.setColor(new Color(255, 0, 0)); // RGB颜色 ``` 3. 文本绘制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值