在执行do-while循环时,让JButton重复更新(与计时器一起使用)时遇到了一些麻烦。我正在开发一个简单的游戏,在10 * 10的图块对象网格上玩,该对象对应于具有100个按钮的JButton arrayList。
程序的此部分处理简单的寻路(即,如果我单击角色,然后单击一个空的图块,则角色将在到达目标的途中在每个图块中移动)。每个步骤之间都有一定的延迟,因此用户可以看到角色的进度。
在当前状态下,移动是正确的,但是JButton仅在角色到达目标时更新,而不是在中间步骤上更新。
public void move(int terrainTile)
{
int currentPosition = actorList.get(selectedActor).getPosition();
int movementValue = 0;
int destination = terrainTile;
int destinationX = destination / 10;
int destinationY = destination % 10;
do
{
currentPosition = actorList.get(selectedActor).getPosition(); // Gets PC's current position (before move)
System.out.println("Old position is " + currentPosition);
int currentX = currentPosition / 10;
int currentY = currentPosition % 10;
if(actorList.get(selectedActor).getCurrentAP() > 0)
{
movementValue = 0;
if(destinationX > currentX)
{
movementValue += 10;
}
if(destinationX < currentX)
{
movementValue -= 10;
}
if(destinationY > currentY)
{
movementValue += 1;
}
if(destinationY < currentY)
{
movementValue -= 1;
}
int nextStep = currentPosition + movementValue;
myGame.setActorIdInTile(currentPosition, -1); //Changes ActorId in PC current tile back to -1
scrubTiles(currentPosition);
actorList.get(selectedActor).setPosition(nextStep); // Sets new position in actor object
System.out.println("Actor " + selectedActor + " " + actorList.get(selectedActor).getName() + " position has been updated to " + nextStep);
myGame.setActorIdInTile(nextStep, selectedActor); // Sets ActorId in moved to Tile
System.out.println("Tile " + nextStep + " actorId has been updated to " + selectedActor);
buttons.get(nextStep).setIcon(new ImageIcon(actorList.get(selectedActor).getImageName()));
// If orthagonal move AP-4
if(movementValue == 10 || movementValue == -10 || movementValue == 1 || movementValue == -1)
{
actorList.get(selectedActor).reduceAP(4);
}
// If diagonal move AP-6
else
{
actorList.get(selectedActor).reduceAP(6);
}
System.out.println(actorList.get(selectedActor).getName() + " has " + actorList.get(selectedActor).getCurrentAP() + " AP remaining");
try
{
Thread.sleep(500); // one second
}
catch (Exception e){}
buttons.get(nextStep).repaint();
}
else
{
System.out.println(actorList.get(selectedActor).getName() + " has insufficient AP to move");
break;
}
}while(destination != (currentPosition + movementValue));
我试过的
button.get(nextStep).repaint(); (尝试在设置imageIcon后输入命令以重新绘制按钮。没有更改。
button.get(nextStep).revalidate(); (无法100%地确定这是怎么做的-它是一种潜在的解决方案,但没有用。
步骤1和2合并
查看了swing计时器类-每次触发actionEvent时都不会发生移动(仅当选择了角色且目标图块为空时),因此不确定如何使它起作用
任何帮助将不胜感激!
我确实不知道您想在评论中确切知道什么,尽管对上述答案+1,但在我看来,这才是真正的原因。看一下这个示例程序,只需将您的调用添加到中的move(...)
方法中timerAction
,似乎可以为您工作。在这里试试这段代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GridExample
{
private static final int SIZE = 36;
private JButton[] buttons;
private int presentPos;
private int desiredPos;
private Timer timer;
private Icon infoIcon =
UIManager.getIcon("OptionPane.informationIcon");
private ActionListener timerAction = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
buttons[presentPos].setIcon(null);
if (desiredPos < presentPos)
{
presentPos--;
buttons[presentPos].setIcon(infoIcon);
}
else if (desiredPos > presentPos)
{
presentPos++;
buttons[presentPos].setIcon(infoIcon);
}
else if (desiredPos == presentPos)
{
timer.stop();
buttons[presentPos].setIcon(infoIcon);
}
}
};
public GridExample()
{
buttons = new JButton[SIZE];
presentPos = 0;
desiredPos = 0;
}
private void createAndDisplayGUI()
{
JFrame frame = new JFrame("Grid Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setLayout(new GridLayout(6, 6, 5, 5));
for (int i = 0; i < SIZE; i++)
{
final int counter = i;
buttons[i] = new JButton();
buttons[i].setActionCommand("" + i);
buttons[i].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
desiredPos = Integer.parseInt(
(String) buttons[counter].getActionCommand());
timer.start();
}
});
contentPane.add(buttons[i]);
}
buttons[presentPos].setIcon(infoIcon);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
timer = new Timer(1000, timerAction);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new GridExample().createAndDisplayGUI();
}
});
}
}
与while循环顶部测试循环条件的for和while循环不同, do...while循环do...while循环底部检查其条件。 do...while循环类似于while循环,除了do ... while循环保证至少执行一次。 语法 (Syntax) Perl中do...while循环的语法是 - do { statement(s); }while( condition ); 应该注意的是
与while循环顶部测试循环条件的for和while循环不同,Objective-C编程语言中的do...while循环检查循环底部的条件。 do...while循环类似于while循环,除了do ... while循环保证至少执行一次。 语法 (Syntax) Objective-C编程语言中do...while循环的语法是 - do { statement(s); } while( co
Pascal中的while-do循环语句允许重复计算,直到满足某些测试条件。 换句话说,只要给定条件为真,它就会重复执行目标语句。 语法 (Syntax) while-do循环的语法是 - while (condition) do S; 其中, condition是布尔值或关系表达式,其值为true或false, S是BEGIN ... END块中的简单语句或语句组。 例如, while num
do-while语句用于模拟其他编程语言中存在的简单while循环。 语法 (Syntax) do-while语句的语法如下 - do while (condition) statement #1 statement #2 ... end 通过首先计算条件表达式(布尔值)来执行while语句,如果结果为true,则执行while循环中的语句。 从while语句中的条件
与while循环顶部测试循环条件的while循环不同, do-while循环do-while循环底部检查其条件。 do-while循环类似于while循环,除了do-while循环保证至少执行一次。 语法 (Syntax) 以下是do-while循环的语法。 do { statement(s); } while( condition ); 请注意,条件表达式出现在循环的末尾,因此循环中的
A Do…While当我们想要重复一组语句时使用Do…While循环,只要条件为真。 可以在循环开始时或循环结束时检查条件。 语法 (Syntax) 以下是VBA中Do…While循环的语法。 Do While condition [statement 1] [statement 2] ... [statement n] [Exit Do] [statement