Java 处理。即使数组内容已更改,使用draw()方法绘制的内容也不会';不变

Java 处理。即使数组内容已更改,使用draw()方法绘制的内容也不会';不变,java,processing,Java,Processing,常数 public final int DIMENSIONS = 4; public final int MOVE_RIGHT = 1; public final int MOVE_LEFT = 2; public final int MOVE_UP = 3; public final int MOVE_DOWN = 4; main PuzzleFrame board; void setup(){ size(401,401); board = new PuzzleFrame();

常数

public final int DIMENSIONS = 4;
public final int MOVE_RIGHT = 1;
public final int MOVE_LEFT = 2;
public final int MOVE_UP = 3;
public final int MOVE_DOWN = 4;
main

PuzzleFrame board;

void setup(){
  size(401,401);
  board = new PuzzleFrame();
  background(100);
}

void draw(){
  background(100);
  board.draw();
}

void keyPressed()
{
  if(key == CODED)
  {
    if(keyCode == RIGHT) board.moveTile(MOVE_RIGHT);
    if(keyCode == LEFT) board.moveTile(MOVE_LEFT);
    if(keyCode == UP) board.moveTile(MOVE_UP);
    if(keyCode == DOWN) board.moveTile(MOVE_DOWN);
  }
}
创建拼图框的类

class PuzzleFrame{
  private Tile[][] puzzleFrame;
  private Tile[][] solvedPuzzleFrame;

  public PuzzleFrame()
  {
    puzzleFrame = new Tile[DIMENSIONS][DIMENSIONS];
    solvedPuzzleFrame = new Tile[DIMENSIONS][DIMENSIONS];
    int tileNumber = 1;
    for(int i = 0; i < DIMENSIONS; i++)
    {
      for(int j = 0; j < DIMENSIONS; j++)
      {
        puzzleFrame[i][j] = new Tile(tileNumber, j*100, i*100);
        solvedPuzzleFrame[i][j] = new Tile(tileNumber, j*100, i*100);
        tileNumber++;
      }
    }
  }

  public void draw()
  {
    for(int i = 0; i < DIMENSIONS; i++)
    {
      for(int j = 0; j < DIMENSIONS; j++)
      {
        puzzleFrame[i][j].draw();
      }
    }
  }

  public void moveTile(int side)
  {
    if(isMoveAllowed(side))
    {
      switch(side)
      {
        case MOVE_RIGHT:
        {
          for(int i = 0; i < DIMENSIONS; i++)
          {
            for(int j = 0; j < DIMENSIONS; j++)
            {
              if(puzzleFrame[i][j].getTileNumber() == DIMENSIONS*DIMENSIONS)
              {
                Tile tempTile = puzzleFrame[i][j];
                puzzleFrame[i][j] = puzzleFrame[i][j-1];
                puzzleFrame[i][j-1] = tempTile;
                System.out.println("right");
                break;
              }
            }
          }
          break;          
        }
      }
    }
  }

  private boolean isMoveAllowed(int side)
  {
    switch(side)
    {
      case MOVE_RIGHT:
      {
        for(int i = 0; i < DIMENSIONS; i++)
        {
          for(int j = 0; j < DIMENSIONS; j++)
          {
            if(puzzleFrame[i][j].getTileNumber() == DIMENSIONS*DIMENSIONS)
            {
              if(j > 0) return true;
            }
          }
        }
        break;
      }
    }
    return false;
  }

}
class Tile{

  private final int mTileNumber;
  private final int width = 100;
  private final int height = 100;
  private String number = "";
  private int xpos;
  private int ypos;
  private int xOffSet;
  private int yOffSet;

  public Tile(int tileNumber, int xpos, int ypos)
  {
    mTileNumber = tileNumber;
    number += tileNumber;
    textSize(64);
    this.xpos = xpos; this.ypos = ypos;
    xOffSet = 30;
    yOffSet = 70;
    if(mTileNumber >= 10)
    {
      xOffSet = 10;
    }
  }

  public void draw()
  {
    if(mTileNumber == DIMENSIONS*DIMENSIONS)
    {
    }
    else
    {
      strokeWeight(2);
      fill(255);
      rect(xpos, ypos, width, height);
      fill(0);
      text(number, xpos+xOffSet, ypos+yOffSet);
    }
  }

  public int getTileNumber()
  {
    return mTileNumber;
  }
}

我正在尝试制作15个益智游戏,但我遇到的问题是,当我向右按箭头键时,益智框架数组的内容发生了变化(我通过调试器在Eclipse中检查了它),但在处理绘制的图像时仍然保持不变。目前,我的代码只包含一个允许向右滑动平铺的函数。老实说,我不明白为什么即使数组的内容发生了变化,图像仍然保持不变。

我知道这并不能回答您的问题,但在赋值过程中如何避免Tile类中出现编译器错误:mTileNumber=tileNumber
您将mTileNumber声明为最终变量,因此不应将其重新分配给任何对象。

也许令人惊讶的是,您不应仅使用“draw()”(如在旧FORTRAN程序中调用函数)。相反,您必须有一个响应图形“绘制”事件的事件处理程序。事件处理程序是进行所有绘图的位置。密钥处理程序可以调用图形“invalidte”来触发重画事件。这里有一个很好的教程:我发现了一个问题,即使数组的内容发生了变化,每个磁贴的坐标也保持不变,因此图像保持不变。谢谢您的帮助。@paulsm4这是处理,不是普通Java。您可以调用一个global draw(),在事件处理函数中调用一个redraw()(也是预先应用的)。请参见@user1796741,可见性不是处理API的一部分。虽然它们可以工作,因为它在PDE中编译时通过javac运行,但任何公共/私有/受保护标记实际上都不是在处理代码,但混合处理+Javaa final是一个变量,其值在赋值后不会更改。他的代码不赋值,只声明,所以第一次赋值是允许的,之后任何试图更改它的行为都会导致“可能已经被赋值”编译器异常