2010-03-18 3 views
1

После того, как я поцарапался, я обнаружил, что лучше всего реализовать пользовательский компонент изображения, расширив JLabel. До сих пор, что работал большой, как я могу добавить несколько «изображения» (компоненты JLabel без макета взлома. Я просто есть вопрос, который я надеюсь, что кто-то может ответить мне.JLabel animation in JPanel

  • Я заметил, что для того, чтобы оживить компоненты JLabel через на экране мне нужно, чтобы setlayout(null); и setbounds компонента, а затем для анимации в конечном итоге setlocation(x,y);. Является ли это лучшей практикой или ужасным способом анимации компонента? Я планирую в конце концов сделать класс анимации, но я не хочу этого делать и

Я включил соответствующий код для быстрой проверки.

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class GraphicsPanel extends JPanel { 
    private Timer timer; 
    private long startTime = 0; 
    private int numFrames = 0; 
    private float fps = 0.0f; 
    private int x = 0; 

    GraphicsPanel() { 
     final Entity ent1 = new Entity(); 
     ent1.setBounds(x, 0, ent1.getWidth(), ent1.getHeight()); 
     add(ent1); 

     //ESSENTIAL 
     setLayout(null); 

     //GAMELOOP 
     timer = new Timer(30, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       getFPS(); 
       incX(); 
       ent1.setLocation(x, 0); 
       repaint(); 
      } 
     }); 
     timer.start(); 
    } 

    public void incX() { x++; } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setClip(0, 0, getWidth(), getHeight()); 

     g2.setColor(Color.BLACK); 
     g2.drawString("FPS: " + fps, 1, 15); 
    } 

    public void getFPS() 
    { 
     ++numFrames; 
     if (startTime == 0) { 
      startTime = System.currentTimeMillis(); 
     } else { 
      long currentTime = System.currentTimeMillis(); 
      long delta = (currentTime - startTime); 
      if (delta > 1000) { 
       fps = (numFrames * 1000)/delta; 
       numFrames = 0; 
       startTime = currentTime;    
      } 
     } 
    } 
} 

Спасибо!

ответ

4

Я заметил, что для того, чтобы оживить компоненты JLabel по всему экрану, мне нужно setlayout (нуль); и setbounds компонента , а затем для анимации в конечном итоге setlocation (x, y) ;. Является ли это Лучшая практика или ужасный способ для анимировать компонент?

Ну, это не совсем так. Вы можете просто играть с местоположением, и ярлык будет перемещаться по экрану. Однако, если вы когда-либо измените размер фрейма или чего-нибудь, тогда будет вызываться менеджер компоновки, и метка будет перепозиционирована, а местоположение, определяемое менеджером макета, которое в случае FlowLayout будет верхним/левым на панели. Затем анимация будет продолжена из этого места. Так что на самом деле, да, это именно то, что вам нужно делать.

Я считаю, что это самый простой способ сделать анимацию, поскольку Swing автоматически перекрасит «последнее» местоположение компонента (для восстановления фона), а также нарисует новое местоположение компонента. Все это достигается с помощью одного метода setLocation().

Некоторые люди любят делать обычную роспись путем рисования изображения непосредственно на панели, но тогда вы отвечаете за очистку старого местоположения изображения, чтобы фон был перерисован, а затем нарисовал изображение в новом месте. Я нахожу это слишком много работы.

+0

Спасибо за быстрый ответ. Точно, что мне нужно :) – 2010-03-18 03:18:31

+0

Просто добавьте первый абзац в качестве редактирования. – camickr

+0

У меня есть эта проблема сейчас. Когда изменится размер jframe jlable, появится в его исходной позиции. Есть ли способ избежать этого. I означает, что я хочу переместить jlable, не появляясь в исходном положении даже при изменении размера? –