You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Java中如何使用用户输入的半径值绘制圆形

解决自定义圆形半径的问题

你遇到的核心问题是:main方法里的变量r是局部变量,作用域仅限main方法,paint方法无法访问;另外drawOval的宽高参数要求是int类型,需要处理类型转换。以下是修改后的代码和关键说明:

修改后的完整代码

import javax.swing.*;
import java.awt.*;
import java.util.Scanner;

public class Circle extends JFrame {
    // 定义类成员变量存储半径,让paint方法可以访问
    private int radius;

    // 构造方法接收半径参数
    public Circle(int radius) {
        this.radius = radius;
        setTitle("Drawing a Circle");
        setSize(500, 500);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g); // 必须调用父类paint方法,确保窗口绘制正常
        Graphics2D g2d = (Graphics2D) g;
        // 宽高是直径,所以用2*radius,同时调整坐标让圆居中
        int diameter = 2 * radius;
        g2d.drawOval(250 - radius, 250 - radius, diameter, diameter);
    }

    public static void main(String[] args) {
        System.out.println("Input radius of circle: ");
        Scanner sc = new Scanner(System.in);
        // 读取用户输入并转换为int类型,需精确的话可用Math.round处理
        int r = (int) sc.nextDouble();
        // 创建Circle实例时传入半径
        new Circle(r);
    }
}

关键修改点

  • 成员变量定义:把radius设为类的私有成员变量,打破局部变量的作用域限制,让paint方法能直接访问。
  • 构造方法传参:修改构造方法接收半径参数,创建窗口实例时将用户输入的半径传入,完成赋值。
  • 调用父类paint方法:重写paint时必须调用super.paint(g),否则窗口背景、边框等元素无法正常渲染。
  • 坐标与尺寸计算:以窗口中心(250,250)为基准,用中心坐标减去半径得到圆的左上角坐标,宽高设为直径(2*radius),保证圆居中显示。
  • 类型转换:drawOval的参数要求是int类型,因此将用户输入的double类型值转换为int,若需保留小数精度,可替换为Math.round(sc.nextDouble())。

内容的提问来源于stack exchange,提问作者Kamen Georgiev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:15:39