我有一个显示硬币图片的程序。当用户点击硬币时,硬币从头到尾变化,反之亦然。这很好。 当我想要一个随机翻转硬币的按钮时出现问题(在这种情况下,包括3到10次)。 用于更改图像图标的方法:
flip.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e1) {
playerCoinState = coinState;
System.out.println("Clicked");
int flips = (new Random().nextInt(8)) + 3;
for(int i = 0; i < flips; i++){
try{
Thread.sleep(1000);
}catch(InterruptedException e2){
System.exit(1);
}
System.out.println("Auto Flipped");
changeFace();
}
}
});
这是用于更改JLabel硬币的ImageIcon的方法:
private void changeFace(){
System.out.println("Changing...");
switch(coinState){
case 0:
System.out.println("Coin State 0");
try {
coin.setIcon(new ImageIcon(ImageIO.read(new File("res/Heads.png"))));
} catch (IOException e) {
e.printStackTrace();
}
coinState = 1;
break;
case 1:
System.out.println("Coin State 1");
try {
coin.setIcon(new ImageIcon(ImageIO.read(new File("res/Tails.png"))));
} catch (IOException e) {
e.printStackTrace();
}
coinState = 0;
break;
}
}
JLabel硬币初始化为:
coin = new JLabel(new ImageIcon("res/Tails.png"));
coinState表示硬币的值。头部为0,尾部为1。 playerCoinState用于跟踪玩家在硬币被计算机随机翻转之前所选择的硬币状态。
答案 0 :(得分:1)
此...
for(int i = 0; i < flips; i++){
try{
Thread.sleep(1000);
}catch(InterruptedException e2){
System.exit(1);
}
System.out.println("Auto Flipped");
changeFace();
}
阻止事件调度线程,阻止ui在方法退出之前被更新
您应该尝试使用Swing Timer
作为伪循环,但在触发EDT上下文中的勾号之前在后台等待一段规定的时间,以便更新安全来自
答案 1 :(得分:0)
coin = new JLabel(new ImageIcon((ImageIO.read(new File("path"))));
使用此代替coin.setIcon(new ImageIcon(ImageIO.read(new File("res/Tails.png"))));
因此,您每次都要创建新的硬币标签。如果您正在使用eclispe和windowbuilder,则可以使用侧栏上的工具。
答案 2 :(得分:0)
MadProgrammer帮我解决了这个问题。
按钮的新的和改进的ActionListener是:
flip.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e1) {
playerCoinState = coinState;
int flips = (new Random().nextInt(10) + 5);
Timer timer = new Timer(400, new ActionListener(){
int counter = 0;
@Override
public void actionPerformed(ActionEvent e) {
if(counter == flips){
((Timer)e.getSource()).stop();
}
changeFace();
counter++;
}
});
timer.start();
}
});
再次感谢MadProgrammer =)