-1

我试图让一个小程序绘制一个圆,从起始半径的大小开始,一遍又一遍地扩大,直到它达到半径的最终大小。只需要朝着正确的方向前进,这就是我到目前为止所拥有的..

import javax.swing.JApplet;
import java.awt.Graphics;
import java.util.Scanner;

public class circleExpandv1 extends JApplet
{
    public void paint( Graphics g )
    {
        super.paint( g ); //instantiate g with paint

        Scanner scan = new Scanner( System.in );

        System.out.print( "\nEnter beginning radius > " );
        int radiusStart = scan.nextInt();  

        System.out.print( "\nEnter ending radius > " );
        int radiusEnd = scan.nextInt();  

        int centerX0 = 150, centerY0 = 50; // set x y cordinates
        int radius0 = radiusStart;  // set radius                 

        int centerX1 = 150, centerY1 = 50; // set x y cordinates
        int radius1 = radiusEnd;  // set radius

        while ( radiusStart != radiusEnd )
        {
             if ( radius0 < radius1 )
             {
                 g.drawOval( centerX0 - radius0, centerY0 - radius0, radius0 * 2, radius0 * 2 ); //draw oval
             }
        }

        //g.clearOval( centerX0 - radius0, centerY0 - radius0, radius0 * 2, radius0 * 2 ); //clear oval

        }
    }
4

2 回答 2

0
while ( radiusStart != radiusEnd )
{
    if ( radius0 < radius1 )
    {
        g.drawOval( centerX0 - radius0, centerY0 - radius0, radius0 * 2, radius0 * 2 ); //draw oval
    }

}

这将永远循环(或根本不循环),因为循环内的代码不会更改 radiusStart 或 radiusEnd。也许这给了你所要求的“朝着正确的方向前进”?

于 2013-11-13T02:35:19.500 回答
0

Swing 是一个单线程环境,也就是说,对 UI 的所有更新都应该在 Event Dispatching Thread 的上下文中发生。这也意味着阻塞该线程的任何操作都会阻止 EDT 处理新事件,包括重绘请求。

paint可以随时调用,并且期望您将重新绘制组件的状态。

paint预计会尽可能快地运行,否则会减慢重绘过程。

您应该避免覆盖paint顶级容器,而是选择创建自定义组件,从类似 a 的东西扩展JPanel,并覆盖它的paintComponent方法。

首先看一下

在您的情况下,我可能建议您使用javax.swing.Timera 定期触发更新,直到您完成最终结果(画一个圆圈)。

请记住,动画是随时间变化的错觉......

您还尝试在图形环境中进行操作。这是一个事件驱动的环境,尝试通过 获取用户输入Scanner是没有意义的,在使用 a 时您也不会发现它特别有用JApplet,因为用户无法响应请求。

相反,您应该利用各种可用的 UI 组件来获取用户输入,包括但不限于JTextField、、、JSpinnerJFormattedTextFieldJButton

查看使用 Swing 创建 GUI 以了解更多详细信息。

我个人会避免JApplet在这个时候使用,因为它会带来一些复杂性,并坚持使用类似的东西JFrame作为你的主要顶级容器。

于 2013-11-13T02:54:58.743 回答