JLabel setIcon无法正常工作

时间:2017-03-10 22:01:25

标签: java swing user-interface

我有一个显示硬币图片的程序。当用户点击硬币时,硬币从头到尾变化,反之亦然。这很好。 当我想要一个随机翻转硬币的按钮时出现问题(在这种情况下,包括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用于跟踪玩家在硬币被计算机随机翻转之前所选择的硬币状态。

3 个答案:

答案 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 =)