JavaFX8时间轴滚动圆形对象的网格?

时间:2016-02-25 23:31:26

标签: javafx-8 timeline

在IntelliJ中使用JavaFX8和JDK 1.8.0_74,我创建了一个基本的像素编辑器应用程序。我有两个窗口(阶段)。一个是放置在网格窗格中的32x128圆形对象矩阵,另一个是工具寡妇;我有一个Controller.java。使用鼠标,“工具”窗口提供绘制线条,矩形等的工具以及“设置”,“文件”和“播放列表”的菜单。 “文件”菜单向用户显示“打开”,“另存为”和“删除”。要查看已保存的像素图文件,用户单击“打开”,然后通过FileChooser打开所选文件,并显示每个Circle的颜色属性。保存的像素艺术文件可以通过Wi-Fi发送到RGB LED矩阵,也是32x128。

要查看图片和视频,请转到:https://virtualartsite.wordpress.com/

我可以使用时间轴向左,向右,向上或向下滚动显示的像素艺术文件。但是,我还想包装像素图像但是却无法消除在包裹开始时出现的小异常,而其余95%的包裹是正确的?

WrapLeft类的关键代码如下:

  public static void runAnimation() {
        timeline = new Timeline(
            new KeyFrame(Duration.millis(200), event -> {
                    wrapFileLeft(pixelArray);
            }));

    timeline.setCycleCount(100);
    timeline.play();
  }   

  public static  void wrapFileLeft(Circle[][] pixelArray){

    // save pixelArray[r][0] in pixelArrayTmp[r][0] and wrap to end, pixelArray[r][col-1]

    Circle[] pixelArrayTmp = new Circle[row];

    for (int r = 0; r < row; r++) {
        pixelArrayTmp[r] = pixelArray[r][0];
    }

    // move all the pixelArray columns one column to the left

    for (int c = 0; c < col-1; c++) {
        for (int r = 0; r < row; r++) {
            Color color = (Color) pixelArray[r][c+1].getFill();
            pixelArray[r][c].setFill(color);
        }
    }

    // move the pixelArrayTmp[r][0] column into the new, blank, end column of pixelArray[r][col-1]

    for (int r = 0; r < row; r++) {
        Color color = (Color) pixelArrayTmp[r].getFill();
        pixelArray[r][col-1].setFill(color);
    }  } }

逻辑是暂时保存第0列,将所有剩余列移到左侧一个位置,并将第127列替换为第0列。这一切都在一个CycleCount()中完成。异常发生在前四个班次中;具有黑色以外颜色的圆形对象变为相邻颜色。但是在四班之后,所有剩下的班次似乎都是正确的?

我最好的猜测是执行的逻辑顺序失序,因为我没有正确使用Timeline或者尝试在单个KeyFrame中执行太多操作?增加持续时间似乎不会影响异常。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

逻辑上,您的解决方案是错误的,您正在将引用存储到临时数组中的圆圈,然后更改引用的圆圈的填充,然后使用更新的引用填充来设置新填充。

不是存储对圆圈的引用,而是存储填充值本身。

public void wrapItLeft(Circle[][] pixelArray){
    // save pixelArray[r][0] in pixelArrayTmp[r][0] and wrap to end, pixelArray[r][col-1]
    Paint[] pixelArrayTmp = new Paint[N_ROWS];
    for (int r = 0; r < N_ROWS; r++) {
        pixelArrayTmp[r] = pixelArray[r][0].getFill();
    }

    // move all the pixelArray columns one column to the left
    for (int c = 0; c < N_COLS-1; c++) {
        for (int r = 0; r < N_ROWS; r++) {
            Color color = (Color) pixelArray[r][c+1].getFill();
            pixelArray[r][c].setFill(color);
        }
    }

    // move the pixelArrayTmp[r][0] column into the new, blank, end column of pixelArray[r][col-1]
    for (int r = 0; r < N_ROWS; r++) {
        pixelArray[r][N_COLS-1].setFill(pixelArrayTmp[r]);
    }  
}