2014-01-14 29 views
0

我是使用java swing的swing和设计界面的新手。我想要一个抽屉在滑动动画上点击按钮。首先,是否有可能这样做,如果是的话,我该怎么做。谢谢。对于某些特定的方法信息,我会很感激。使用java swing的滑动抽屉动画

+0

能否请你大致让我们了解您已经有了,简而言之?就像,现在你的“抽屉”是什么?是否有一些'JPanel'被添加到一些'null'用于布局的'Container'? – ccjmne

+0

我只是有一个画布......我知道如何添加一个按钮,并点击按钮,单击如何弹出一个新的窗口..但我不知道如何执行动画.. – nitinsh99

回答

2

有许多你可能取决于你想要什么实现的可能途径实现。

的基本方法将被简单地画了graphics和摆动Timer

这将让您只需更新这将充当抽奖尺寸的基础上,例如一个变量...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DrawerPaneTest { 

    public static void main(String[] args) { 
     new DrawerPaneTest(); 
    } 

    public DrawerPaneTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new DrawerPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class DrawerPane extends JPanel { 

     private boolean drawIn = false; 
     private Timer timer; 
     private int drawWidth = 0; 
     private int drawDelta = 4; 

     public DrawerPane() { 
      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        timer.stop(); 
        drawIn = !drawIn; 
        drawDelta = drawIn ? 4 : -4; 
        timer.start(); 
       } 
      }); 

      timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        drawWidth += drawDelta; 
        if (drawWidth >= getWidth()/2) { 
         drawWidth = getWidth()/2; 
         timer.stop(); 
        } else if (drawWidth < 0) { 
         drawWidth = 0; 
         timer.stop(); 
        } 
        repaint(); 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.RED); 
      g2d.drawFill(0, 0, drawWidth, getHeight()); 
      g2d.dispose(); 
     } 
    } 

} 

这是非常基本的,并没有考虑到诸如概念慢/慢等问题。对于这些,你最好看看一个专门的动画框架,像

您可能需要使用取决于什么是你想要实现的,我个人喜欢时间框架,主要是因为它给了我很大的自由度,像三叉戟这样的东西(主要)被设计为提供改变对象属性的能力,例如大小或位置。虽然时序框架可以做到这一点,但需要更多工作才能达到这一点。

我没有用通用吐温引擎,但已经看到了一些真正的好例子,如Sliding-Layout,这实际上可能meeet您的需求...

1

首先,我认为你不应该使用Canvas,因为IMO不应该将Swing的组件与AWT混合使用(如果没有必要的话)(我正在谈论你放置在实际组件中的实际组件GUI - 我知道Swing是建立在AWT之上的)。

您可以改为使用JPanel并使用其paintComponent方法执行自定义绘画。有很多关于此的教程(例如Lesson: Performing Custom Painting)。一旦你想出了如何在你的JPanel中绘制抽屉(简单地使用Graphics2D绘图),你就需要对它进行动画处理:基本上,你只需要更新它的一些属性,很可能是某个位置。 ..
你想有一些很好的缓解效果,一切都很容易处理和打包,我建议你看看Universal Tween Engine。我已经使用它,并可以帮助你。

一旦你有你通用吐温引擎库链接到您的项目,只需使用一些电话如下:

Tween 
    .to(drawerProperties, Type.POSITION, 10.0f) // animate the POSITION property of your drawerProperties on 10.0 units of time 
    .target(100) // set the number of frames of that animation to 
    .ease(Quad.OUT) // set a nice quadratic effect on the animation 
    .start(tweenManager); // launch the animation 

然后,在其他地方,你只需要有一个Thread运行不断更新您的TweenManager使用TweenManager#update

再次,它看起来像一个大量的工作,但它实际上是非常容易使用和通用吐温引擎入门部分是非常好的。此外,如果你想真正动画添加到您的项目,这可以肯定是使用一个伟大的工具:)

最后一点:你可能需要在Swing的事件指派线程更新您的性质,取决于您的解决方案将如何实施。如果你不知道这么多关于这一点,你可以阅读Lesson: Concurrency in Swing - 或者只是搜索StackOverflow的,如果你已经具体问题:)