Animation 带通用Tween发动机的滑动JPanel

Animation 带通用Tween发动机的滑动JPanel,animation,frameworks,jpanel,tween,universal,Animation,Frameworks,Jpanel,Tween,Universal,几天来,我一直在尝试创建一个JPanel,它从侧面飞来。我找到了Universal Tween引擎,也看到了一些演示,但由于某种原因,我一直无法在自己的代码中使用它。为了简单起见,让我们尝试将JFrame上的JPanel(包含JLabel中的图像)从(0,0)移动到(600,0)。这是迄今为止我所得到的,也是我有史以来最接近于用这个框架实际移动东西的东西,它所做的一切使JPanel在第一个滴答声左右的时间内跳转到它的目的地。这应该很简单,但我一定错过了什么 SlideTest.java-创建UI

几天来,我一直在尝试创建一个JPanel,它从侧面飞来。我找到了Universal Tween引擎,也看到了一些演示,但由于某种原因,我一直无法在自己的代码中使用它。为了简单起见,让我们尝试将JFrame上的JPanel(包含JLabel中的图像)从(0,0)移动到(600,0)。这是迄今为止我所得到的,也是我有史以来最接近于用这个框架实际移动东西的东西,它所做的一切使JPanel在第一个滴答声左右的时间内跳转到它的目的地。这应该很简单,但我一定错过了什么

SlideTest.java
-创建UI,初始化线程+Tween

public class SlideTest {
    TweeningPane p;
    public TweenManager tweenManager;

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

    public SlideTest() {
        try {
            setupGUI();
        } catch (IOException e) {
            e.printStackTrace();
        }
        tweenManager = new TweenManager();
        AnimationThread aniThread = new AnimationThread();
        aniThread.setManager(tweenManager);
        aniThread.start();
        Tween.to(p, 1, 10.0f).target(600).ease(Quad.OUT).start(tweenManager);
    }

    public void setupGUI() throws IOException {
        JFrame f = new JFrame();
        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        p = new TweeningPane();
        JLabel l = new JLabel(new ImageIcon("E:/Pictures/Stream/aK6IX4V.png"));
        f.setLayout(null);
        p.add(l);
        p.setBounds(0, 0, 300, 300);
        f.add(p);
        f.setVisible(true);
    }
}
java——这个线程应该尽可能多/经常地更新我的TweenManager

public class AnimationThread extends Thread {
    TweenManager tm;

    public void setManager(TweenManager tweenmanager) {
        this.tm = tweenmanager;
    }

    public void run() {
        while (true) {
            //System.out.println("MyThread running");
            tm.update(MAX_PRIORITY);
            try {
                sleep(40);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
java-我的对象(JPanel),我想在JPanel中移动

public class TweeningPane extends JPanel implements TweenAccessor<JPanel> {

    private static final long serialVersionUID = 1L;

    @Override
    public int getValues(JPanel arg0, int arg1, float[] arg2) {

        return (int) arg0.getBounds().getX();
    }

    @Override
    public void setValues(JPanel arg0, int arg1, float[] arg2) {
        arg0.setBounds((int) arg2[0], 0, 300, 300);

    }

}
公共类TweeningPane扩展了JPanel实现TweenAccessor{
私有静态最终长serialVersionUID=1L;
@凌驾
公共int getValues(JPanel arg0、int arg1、float[]arg2){
返回(int)arg0.getBounds().getX();
}
@凌驾
公共void集合值(JPanel arg0、int arg1、float[]arg2){
arg0.setBounds((int)arg2[0],03000);
}
}

我终于明白了。正如我所料,我只是以错误的方式使用了这个框架。我不确定是否需要所有这些步骤,但这是我为了使其工作而经历的:(供将来参考)

我必须注册我的引擎访问者:

Tween.registerAccessor(TweeningPane.class, new TweeningPane());
线本身现在看起来是这样的;我必须将经过的时间作为参数提供给经理的update方法

public void run() {
    long ms1 = System.currentTimeMillis();
    while (true) {
        //System.out.println("MyThread running");
        tm.update((System.currentTimeMillis() - ms1) / 1000f);
        try {
            Thread.sleep(40);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

我终于明白了。正如我所料,我只是以错误的方式使用了这个框架。我不确定是否需要所有这些步骤,但这是我为了使其工作而经历的:(供将来参考)

我必须注册我的引擎访问者:

Tween.registerAccessor(TweeningPane.class, new TweeningPane());
线本身现在看起来是这样的;我必须将经过的时间作为参数提供给经理的update方法

public void run() {
    long ms1 = System.currentTimeMillis();
    while (true) {
        //System.out.println("MyThread running");
        tm.update((System.currentTimeMillis() - ms1) / 1000f);
        try {
            Thread.sleep(40);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}