归档带有颜色的标签

时间:2013-05-25 12:47:55

标签: java labels

我有标签网格(大小为n * n),我想用不规则部分填充颜色。我写了一个方法

private void fill(int j){

    while(board[j].getName().equals("s")){
       board[j].setBackground(Color.yellow);

       try{
            fill(j-1);   
        } catch (ArrayIndexOutOfBoundsException e){}

       try{
            fill(j+1);     
       } catch (ArrayIndexOutOfBoundsException e){}

       try{
            fill(j+n);  
            } catch (ArrayIndexOutOfBoundsException e){}

       try{
            fill(j-n);   
            } catch (ArrayIndexOutOfBoundsException e){}

    }
}

我仍然得到StackOverflowError。我没有使用大部件(我的n是最大20),我试图用if替换,但是也没有用。它对于堆栈来说太大了还是可能存在无限循环?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

让我们说出于某种原因

  • jj-1中的while条件将得到满足,
  • 表示j-2不是
  • 等其他值

因此,如果您调用fill(j)程序将

  1. while(通过)
  2. 的测试j条件
  3. 输入while循环
  4. {li> setBackground j
  5. 调用fill(j-1);

    在程序调用{​​{1}}之前,程序必须完成fill(j+1),因此控制流程将移至fill(j-1)级别,程序将

    1. fill(j-1)(通过)
    2. 的测试while条件
    3. 您输入j-1循环
    4. {li> while setBackground 换句话说,
    5. 调用j-1 fill((j-1)-1);

      再次将fill(j-2)控制流程移至fill((j-1)+1)之前,程序将

      1. fill(j-2)的{​​{1}}条件(失败)
      2. 程序无法进入循环,因此将从fill(j-2)
      3. 返回
    6. 调用与while
    7. 相同的j-2
  6. 因此,您的应用程序将尝试重复相同的方案,但这次是在不同的堆栈级别,这将导致StackOverwlow。


    为了防止这种情况,可能会改变条件,以便测试你是否已经在这个位置,如

    fill((j-1)+1)

    您可以/也应该将fill(j)更改为while(board[j].getName().equals("s") && board[j].getBackground() != Color.yellow)

答案 1 :(得分:0)

board[j].setName("bgSet")

board[j].setBackground(Color.yellow)

这可能会解决问题,否则你的时间总是如此。