有递归问题

时间:2014-04-22 19:29:42

标签: java

我对这个程序的目标是让牛眼颜色来回切换。然而,颜色不切换它会产生新的颜色。当我试图以任何方式重复它时,更紧迫的问题。程序运行时出现的屏幕是空白的,什么都不做。当没有循环时,靶心会出现。

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;

public class BullSEye extends JPanel
{
   public void paintComponent( Graphics g )
   {

    super.paintComponent( g );
    Random rand = new Random();

    int top = 2;
    int r = rand.nextInt(256);
    int b = rand.nextInt(256);
    int h = rand.nextInt(256);
    int t = rand.nextInt(256);
    int u = rand.nextInt(256);      
    int v = rand.nextInt(256);

    Color randomColor = new Color(r, h, b);
    Color randColor = new Color(t,u,v);

    //sets colors for first bullseye
    g.setColor(randomColor);    
    g.fillOval( 10, 10, 200, 200 );
    g.setColor(randColor);
    g.fillOval( 35, 35, 150, 150 );
    g.setColor(randomColor);
    g.fillOval(60, 60, 100, 100);
    g.setColor(randColor);
    g.fillOval( 85, 85, 50, 50 );

    try
    {
       Thread.sleep(1000); // do nothing for 1000 miliseconds (1 second)
    }
    catch(InterruptedException e)
    {
       e.printStackTrace();
    }

    //sets colors for second bullseye
    g.setColor(randColor);
    g.fillOval( 10, 10, 200, 200 );
    g.setColor(randomColor);
    g.fillOval( 35, 35, 150, 150 );
    g.setColor(randColor);
    g.fillOval(60, 60, 100, 100);
    g.setColor(randomColor);
    g.fillOval( 85, 85, 50, 50 );

    //recursive call to repeat the back and forth colors
    paintComponent(g);

   }

}

import javax.swing.JFrame;

public class BullSEyeTest 
{

   public static void main( String args[] )    
   {

      BullSEye panel = new BullSEye();

      JFrame application = new JFrame();

      application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      application.add( panel );
      application.setSize( 230, 250 );
      application.setVisible( true );

   }

}

1 个答案:

答案 0 :(得分:1)

这里有几个问题可能会导致您的问题。

首先,您为颜色生成随机数,这就是为什么每次运行程序时都会得到不同的颜色(没有递归调用)。

如果你每次都想要相同的颜色,你不需要随机数生成器,它们只是常量。

其次,递归不是在Swing中重新呈现UI的正确方法。 Swing提供了一个重复的“重拍”。在JComponent上的方法,通常你会从一个从定时器触发的动作监听器调用该重绘方法,而不是递归地执行。此外,您正在获取无响应的UI,因为您告诉线程要休眠。

希望有助于回答您的问题。查看这篇文章,了解有关如何实现这一目标的更多信息:

Java - repaint component every second?