如何更新JPanel中的JLabel?

时间:2014-09-19 02:35:54

标签: java jpanel jlabel

我无法在JLabel上获取图像以在JPanel中更新。我不知道问题是什么。我已经尝试删除现有的JLabel并向JPanel添加一个新的JLabel,但这不起作用。这是我试图让动画工作的代码。我的关键听众工作正常,所以我确信这堂课有一些问题:

import javax.swing.*;
import java.awt.event.*;
public class Character extends JPanel{
  //Constructs array that holds running frames
  static ImageIcon running[] = new ImageIcon[19];
  static int i = 0;
  //Contstructs label that holds the current image frame
  static JLabel characterLabel = new JLabel();
  //Creates imageicon to be returned to the character and stored in characterLabel
  static ImageIcon character = new ImageIcon();

  Timer runningTimer = new Timer(300, new RunningListener());



  public Character() {

    running[0] = new ImageIcon("running 1.png");
    running[1] = new ImageIcon("running 2.png");
    running[2] = new ImageIcon("running 3.png");
    running[3] = new ImageIcon("running 4.png");
    running[4] = new ImageIcon("running 5.png");
    running[5] = new ImageIcon("running 6.png");
    running[6] = new ImageIcon("running 7.png");
    running[7] = new ImageIcon("running 8.png");
    running[8] = new ImageIcon("running 9.png");
    running[9] = new ImageIcon("running 10.png");
    running[10] = new ImageIcon("running 11.png");
    running[11] = new ImageIcon("running 12.png");
    running[12] = new ImageIcon("running 13.png");
    running[13] = new ImageIcon("running 14.png");
    running[14] = new ImageIcon("running 15.png");
    running[15] = new ImageIcon("running 16.png");
    running[16] = new ImageIcon("running 17.png");
    running[17] = new ImageIcon("running 18.png");
    running[18] = new ImageIcon("running 19.png");
    characterLabel.setIcon(running[0]);
    this.add(characterLabel);
  }

  private void refreshCharacter(){
     this.remove(characterLabel);
    characterLabel.setIcon(running[i]);
    this.add(characterLabel);
    i++;
    if (i > 18){
      i = 0;
    }
  }

  private class RunningListener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
      refreshCharacter();
    }
  }
}

我认为这个JPanel可能也是问题,但我对此表示怀疑:

import javax.swing.*;

//Panel that manages the game
public class GamePanel extends JPanel{


  //Adds stuff to GamePanel to send to Frame
  public GamePanel(){

    this.addKeyListener(new KeyInput());
    this.add(new Character()); 
  }
}

以下是关键听众:

import java.awt.event.*;

//Listens for key actions
public class KeyInput implements KeyListener{

  //Constructs character
  Character c = new Character();

  public void keyPressed(KeyEvent evt) {
    int key = evt.getKeyCode();
    //When the right key is pressed, start the timer that starts the running animation
    if(key == KeyEvent.VK_RIGHT){
      c.runningTimer.start();
    }
  }

  public void keyReleased(KeyEvent evt){
    int key = evt.getKeyCode();
    //When the right key is released, the timer that starts the running animation is stopped
    if(key == KeyEvent.VK_RIGHT){
   c.runningTimer.stop();
    }
  }

  //There is no use for this... it just has to be there
  public void keyTyped(KeyEvent evt){
  }
}

这是框架:

import javax.swing.*;
public class Frame{

  //Creates window and calls to GamePanel
  public static void main (String[]args){
    GamePanel gamePanel = new GamePanel();
    JFrame window = new JFrame("Game");

    window.add(gamePanel);
    window.setLocation(50,50);
    window.setSize(1000,650);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setVisible(true);
    gamePanel.requestFocus();
  }
}

1 个答案:

答案 0 :(得分:1)

如果您尝试更改显示的图像,如果可以避免,请不要删除JLabel或组件,而是交换JLabel的图标。如果你不是想改变一个图像,而是做一些与众不同的事情,那么请告诉我们你想要的行为的更多细节,因为你告诉我们的是你正在尝试“动画”,这有点宽泛。

如,

private void refreshCharacter() {
   i++;
   i %= running.length;
   characterLabel.setIcon(running[i]);
}