我有一个显示硬币图片的程序。当用户点击硬币时,硬币会从正面变为反面,反之亦然。效果很好。 当我想要一个按钮来随机翻转硬币几次(在本例中为 3 到 10 次(包括 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代表硬币的值(value)。 0 表示正面,1 表示反面。 playerCoinState 用于跟踪玩家在计算机随机翻转硬币之前选择的硬币状态。
最佳答案
这个...
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 上下文中触发滴答,从而使其可以安全地更新 UI
关于java - JLabel setIcon 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42728434/