移动时将新图像加载到jlabel时出错

时间:2015-02-18 08:35:55

标签: java image swing jframe jlabel

我想要的是按下" A"," S"," D"和" W"角色按各自的方向移动键。

问题在于,每当我改变方向时,我都会改变JLabel的图像(它是一个箭头)。

它确实很有效,但每次更改图像时,JLabel都会返回默认位置一秒钟。然后JLabel继续从那里开始。

这是代码。

private int pX;
private int pY;

public MovePj() {
     initComponents();
     pX=labelPj.getX();
     pY=labelPj.getY();  }

private void formKeyPressed(KeyEvent evt) {            

    switch(evt.getKeyCode()){
        case 87:                                                                                    //Norte
            pY=pY-movimiento;
            labelPersonaje.setIcon(new ImageIcon(rutaBase+"Imagenes\\movement\\07-north.png"));
            break;
        case 83:                                                                                    //Sur
            pY=pY+movimiento;
            labelPersonaje.setIcon(new ImageIcon(rutaBase+"Imagenes\\movement\\03-sur.png"));
            break;
        case 68:                                                                                    //Este
            pX=pX+movimiento;
            labelPersonaje.setIcon(new ImageIcon(rutaBase+"Imagenes\\movement\\01-east.png"));
            break;
        case 65:                                                                                    //Oeste
            pX=pX-movimiento;
            labelPersonaje.setIcon(new ImageIcon(rutaBase+"Imagenes\\movement\\05-west.png"));
            break;
        default:
            break;
    }
    labelPersonaje.setLocation(pX, pY);
   //labelPj.setBounds(pX, pY, labelPj.getWidth(), labelPj.getHeight());

}

角色移动正确,但要更改JLabel的图像,这将返回到预设点。

感谢。

1 个答案:

答案 0 :(得分:0)

setIcon(...)方法将调用:

revalidate();
repant();
标签上的

导致调用布局管理器。所以我猜你需要使用:

panel.setLayout( null );

防止重新计算标签的大小/位置。您可以在创建面板时执行此操作。

此外,响应KeyEvent读取图像并不是一个好主意。您应该在加载类时阅读图像以获得更好的性能。