好的,所以我通过创建一个java应用程序来完成一个速成课程,并且遇到执行操作的问题。该程序是15拼图,游戏中你一次滑动一件并尝试按顺序获取所有数字,所以我允许一个“自动”模式选项,一旦点击就会解决用户的电路板。因此,我的代码从文本文件中读取解决方案,该文件正常工作,当我单击自动按钮时,没有任何“正方形”(JButtons)移动。因此,我不确定我是否完全不了解行动甚至是完整的过程。继承我的代码,如果有必要,我可以提供更多代码。
if (e.getSource() == ctrButtons[0]) {
System.out.println("Auto Mode started\n");
Scanner s = null;
try {
s = new Scanner(new BufferedReader(new FileReader("move_list.txt")));
int count = 0;
while (s.hasNext()) {
//Cycle through to move in move_list
if (count != 18) {
s.next();
count+=1;
}
else {
int cur_move = Integer.parseInt(s.next());
count = 0;
/*Use cur_move to move blank space accordingly
*UP------------3
*LEFT----------2
*RIGHT---------1
*DOWN----------0
*/
int zero_index = -1;
for (int j=0; j<jbnButtons.length; j++) {
if (Integer.parseInt(jbnButtons[j].getText()) == 0) {
zero_index = j;
break;
}
}
Point zero = jbnButtons[zero_index].getLocation();
//Check if move is up
if (cur_move == 3) {
Point next = jbnButtons[zero_index-4].getLocation();
jbnButtons[zero_index].setLocation(next);
jbnButtons[zero_index-4].setLocation(zero);
}
//Check if move is left
else if (cur_move == 2) {
Point next = jbnButtons[zero_index-1].getLocation();
jbnButtons[zero_index].setLocation(next);
jbnButtons[zero_index-1].setLocation(zero);
}
//Check if move is right
else if (cur_move == 1) {
Point next = jbnButtons[zero_index+1].getLocation();
jbnButtons[zero_index].setLocation(next);
jbnButtons[zero_index+1].setLocation(zero);
}
//Check if move is down
else {
System.out.println("Current move = 0");
Point next = jbnButtons[zero_index+4].getLocation();
jbnButtons[zero_index].setLocation(next);
jbnButtons[zero_index+4].setLocation(zero);
}
}
}
}
因此,当我单击“自动”按钮时,我的代码会执行,然后我将输出打印到屏幕上以查看它是否正在循环显示代码,只是没有按钮每次都在循环中移动。任何想法??
答案 0 :(得分:1)
您的代码正在Event Dispatch Thread上执行。在代码完成执行之前,GUI无法重新绘制,因此您不会看到中间步骤只是每个组件的最终位置。
阅读Concurrency上Swing教程中的tje部分,以获得更完整的解释。
也许你应该使用Swing Timer(该教程也有一个关于此的部分)。每次定时器启动时,您都会执行下一步操作。