Java扩展圈

时间:2013-11-13 02:30:59

标签: java

我正在尝试让一个小程序画一个圆,从开始半径的大小开始一遍又一遍地扩展,直到达到半径的结束大小。只需要向正确的方向推进这是我到目前为止所拥有的......

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

        }
    }

2 个答案:

答案 0 :(得分:0)

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

}

这将永远循环(或根本不循环),因为循环内的代码不会改变radiusStart或radiusEnd。也许这会为您提供所需的&#34;推进正确的方向&#34;?

答案 1 :(得分:0)

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

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

预计

paint将尽可能快地运行,否则会降低重绘过程的速度。

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

首先看看

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

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

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

相反,您应该使用可用的各种UI组件来获取用户输入,包括但不限于JTextFieldJSpinnerJFormattedTextField和{{ 1}}

请查看Creating a GUI with Swing了解详情。

我个人会在此时避免使用JButton,因为它会带来复杂性,并坚持使用JApplet等主要顶级容器。