2011-03-14 21 views
1

我试图实现一个小的Applet,它可以执行一些动画。我想在JPanel中执行动画并在动画JPanel下面进行播放/暂停,并跳过按钮来控制动画。为了正确地做到这一点,我想我需要在一个线程中有动画。 (对吗?)使用Swing和线程设计JApplet动画

我的问题是:什么是组织我的类为这个应用程序的好方法?如何让我的动画线程在JPanel内部运行?

我一直在寻找oracle.com的教程,这是我迄今为止...

Class AnimationApplet extends JApplet { 

... 

    public void init(){ 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       public void run() { 
        createGUI(); 
       } 
      }); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(TabApplet.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (InvocationTargetException ex) { 
       Logger.getLogger(TabApplet.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

    private void createGUI() { 
     AnimationPanel ac = new AnimationPanel(); 
     this.setConentPane(ac); 
    } 

} // Class AnimationApplet 

class AnimationPanel extends JPanel implements ActionListener { 
    ... 
} 

编辑:我不知道这是否会帮助,但这里是什么我正在努力。我正在创建一个吉他选项卡播放器,因此需要继续在屏幕上滑动笔记,然后在某些点(第16个音符),检查是否有音符动画。这看起来有些困难,因为你无法均匀分配每分钟节拍。所以现在,我想把它分成4或5个速度(最慢,慢,中等等);

感谢,

内特

+0

添加了Swing和动画标签 – 2011-03-14 03:04:22

回答

2

不,你不需要直接使用线程,因为你可以简单地使用一个Swing计时器来驱动动画(虽然理解,这里使用线程在后台)。我会让我的动画组件扩展JPanel,并在其paintComponent方法中绘制。我会避免让gui或“view”类像上面那样扩展一个监听器类,因为这会让单个类做太多。我要么使用匿名内部监听器,要么使用私有内部类监听器,要么使用复杂的独立监听器类。

另一个警告 - 确保您的paintComponent方法只进行绘画和绘画,它不包含程序逻辑,并避免在此方法中创建类或读取图像。它需要精益和快速。

+1

最近有人指出,如果您重写paint()/ paintComponent(),那么JPanel不会比JComponent提供更多(有用的)功能。 – 2011-03-14 02:59:30

+0

感谢Andrew提供的信息,但您能详细说明一下吗?当paintComponent被覆盖时,什么功能会丢失,super.paintComponent是从哪里调用的? JPanel的默认设置仍然是true,它仍然绘制背景,并且像JPanel通常那样是不透明的(当你需要他时,Rob Camick在哪里?)。 – 2011-03-14 03:01:55

+0

我将添加一个Swing和Animation标签,也许这会得到Rob的关注。 ;) – 2011-03-14 03:04:01