java - 如何更新 JPanel 中的 JLabel?

标签 java jpanel jlabel

我无法在 JPanel 中更新 JLabel 上的图像。我不明白问题是什么。我尝试删除现有的 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();
  }
}

最佳答案

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

例如,

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

关于java - 如何更新 JPanel 中的 JLabel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25925512/

相关文章:

java - 将 JScrollPane 添加到从 JPanel 扩展的类

java - 从数据库读取时图像在 JPanel 中消失

java - 在 JLabels 之间创建垂直空间未按预期进行

java - 安全约束 <url-pattern> 行为异常 - websphere

java - 加载文件后如何刷新 ChartPanel 类中的图表?

java - 如何从java中的字符串中删除一些单词

java - Android:将数据备份到互联网的最佳方式?

Java游戏卡顿,if语句太多?

java - 在 Java 中删除标签

java - JLabel 数组与 Graphics2D 绘画