java - JLabel setIcon 不起作用

标签 java swing user-interface

我有一个显示硬币图片的程序。当用户点击硬币时,硬币会从正面变为反面,反之亦然。效果很好。 当我想要一个按钮来随机翻转硬币几次(在本例中为 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/

相关文章:

c++ - 从控制台和 gui 应用程序的输入设计中读取值 (c++)

java - catch (Exception ex) block 未命中

java - Java优先级队列中的compareTo工作不稳定

java - JTextField setText() 方法不更新字段

java - Java 中的日期时间选择器

Java组合框 Swing

windows - 在 Windows 上更改 GTK+3 外观

Javafx 获取 Ping 结果

Java Processbuilder 流转 Python 脚本

java - Swagger jaxrs 不工作