在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中执行太多操作?增加持续时间似乎不会影响异常。
感谢您的帮助。
答案 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]);
}
}