我正在尝试让一个小程序画一个圆,从开始半径的大小开始一遍又一遍地扩展,直到达到半径的结束大小。只需要向正确的方向推进这是我到目前为止所拥有的......
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
}
}
答案 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组件来获取用户输入,包括但不限于JTextField
,JSpinner
,JFormattedTextField
和{{ 1}}
请查看Creating a GUI with Swing了解详情。
我个人会在此时避免使用JButton
,因为它会带来复杂性,并坚持使用JApplet
等主要顶级容器。