【问题标题】:Why is my program not showing background color change after an interval?为什么我的程序在间隔后不显示背景颜色变化?
【发布时间】:2020-10-29 14:40:01
【问题描述】:

我已经尝试了几个小时来找出我在 java 中的一个简单程序中的错误。我希望在 200 毫秒后显示背景颜色的变化,所以我编写了这个程序,但它没有显示正确的输出。

这是一个很长的程序提前感谢阅读。

public class bgColor extends Applet implements Runnable
{
     Thread timer=null;
     int c,flag;
  public void init()
  {
    c=0;
    setBackground(new Color(255,255,255));  
  }
  public void start()
  {
     if(timer==null)
    {
     timer=new Thread(this);
     timer.start();
    }
  }
 public void paint(Graphics g)
 {
  switch(c)
  {
  case 0:setBackground(Color.white);
         break;
  case 1:setBackground(Color.blue);
         break;
  case 2:setBackground(Color.green);
         break;
  case 3:setBackground(Color.red);
         break;
  }
 if(c==4)
 {
  flag=0;
 }
 else if(c==0)
 {
  flag=1;
 }
 if(flag==0)
 {
   c--;
 }
 else if(flag==1)
 {
   c++;
 }
}
public void stop()
{
   timer=null;
}
public void run()
{
   if(timer!=null)
   {
         repaint();
         c++;
   try
   {
         Thread.sleep(200);
   }
   catch(InterruptedException e){}
   }
         timer=null;
}
}

我基本上设置了一个开关,用于在特定时间间隔后更改背景颜色,但它始终只显示红色。

如果有人可以建议我可以在哪里阅读程序如何逐步运行,就像我认为可能是 init(),然后 start() 然后 run(),然后 paint() 然后 stop(),那也会有很大帮助但这纯粹是我的猜测。我需要一个真实的来源。

【问题讨论】:

  • 声明volatile int c; int flag; 这样两个线程可以共享字段。否则,一个线程的更改将不会到达另一个使用过时值的线程。

标签: java colors


【解决方案1】:

您是否尝试过打印c

线程比paint 更频繁地运行,因为即使您调用repaint 一百万次,它每帧最多只能绘制一次。睡眠会有所帮助,但它只会降低竞争条件的风险,而不是消除问题。

你还有一个竞争条件,c 可以超过 4 并且标志永远不会切换。尝试使用 c >= 4c <= 0 来避免这种情况。根据您的描述,这可能是您的问题。

【讨论】:

  • 打印 C 是最有帮助的
  • 我能再问一件事吗?请你能准确地告诉我 repaint() 在这里做什么吗?并请提及遍历顺序(我的问题的第二部分)
  • repaint() 只是请求在下一帧重新绘制窗口/组件。除非请求绘制,否则它将尝试重用前一帧。帧率高于显示器刷新率是没有意义的,所以它不会尝试。然后由图形/事件线程调用paint(...) 方法(通常命名为awt-eventqueue-0 的一些变体)。你也不应该期望paint 只在使用repaint 时被调用。调整窗口大小等其他事件也会触发绘制事件。由于涉及两个线程,因此很容易出现竞争条件。
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多