簡體   English   中英

如何在JPanel中更新JLabel?

[英]How do I update a JLabel in a JPanel?

我在獲取JLabel上的圖像以在JPanel中更新時遇到麻煩。 我看不出問題是什么。 我曾嘗試刪除現有的JLabel並將一個新的JLabel添加到JPanel,但這是行不通的。 這是我要讓動畫開始工作的代碼。 我的關鍵偵聽器工作正常,因此我可以確定此類中存在一些問題:

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]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM