Java - 为什么在执行代码行时我的JLabel图标不会立即更新?

时间:2016-08-02 17:38:58

标签: java netbeans icons jlabel

(原谅我的格式化)

我正在使用JLabel(jLabel3)作为我正在制作的游戏的背景图像。我有另一个JLabel(jLabel4)作为玩家。当玩家到达某个位置时,地图(jLabel3)会变为("/newpackage/Map2TreasureHunt.png")

我的代码:

if ((x == (66 + 5 * 50)) && (y == (215 + 51))) {

    jLabel3.setIcon(new ImageIcon(getClass().getResource("/newpackage/Map2TreasureHunt.png")));
        x = 316; //( 66 + 5*50) 
        y = 11; // y - 4 * 51;

    } jLabel4.setLocation(x, y);

我通过Netbeans中的Debug运行它,并且在if结束后总是更新图标。然后,我尝试了两个if:

if ((x == (66 + 5 * 50)) && (y == (215 + 51))) {

    jLabel3.setIcon(new ImageIcon(getClass().getResource("/newpackage/Map2TreasureHunt.png")));
        //x = 316; //( 66 + 5*50)
       // y = 11; // y - 4 * 51;

    } 

if (jLabel3.getIcon().toString().equals("/newpackage/Map2TreasureHunt.png")){
        x = 316; //( 66 + 5*50)
        y = 11; // y - 4 * 51;
    }

如果运行,JLabel(jLabel3)会在BOTH之后更新。

我不太明白这里发生了什么。如果有人知道一种更有效的方法来重写这段代码,那也很不错。

谢谢! -littleCode

1 个答案:

答案 0 :(得分:1)

Swing中的所有内容都发生在一个线程中:事件派发线程,基本上执行以下操作:

  1. 等待活动(点击,按键等)
  2. 执行此事件的侦听器
  3. 重述需要的内容
  4. 回到1。
  5. 所以,当你仍然在代码内部对一个事件作出反应时,什么都不会被重新绘制。推论是,如果你在事件dipatch线程中无限循环,UI将完全冻结。