首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有通用补间引擎的Sliding JPanel

带有通用补间引擎的Sliding JPanel
EN

Stack Overflow用户
提问于 2016-12-04 10:11:31
回答 1查看 56关注 0票数 1

几天来,我一直在尝试创建一个JPanel,它是从侧面飞进来的。我找到了通用的补间引擎,也看了一些演示,但由于某种原因,我从来没有能够在我自己的代码中使它工作。为简单起见,让我们仅尝试将一个JPanel (在JLabel中包含一个图像)从JFrame上的(0,0)移动到(600,0)。这是我到目前为止得到的,也是我用这个框架实际移动过的最接近的东西,它所做的一切都是让JPanel在第一个滴答声中跳到它的目的地。它应该是如此简单,但我一定遗漏了什么……

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

代码语言:javascript
复制
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);
    }
}

AnimationThread.java -线程,它应该尽可能多地/频繁地更新我的TweenManager

代码语言:javascript
复制
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();
            }
        }
    }
}

TweeningPane.java -我的对象( JPanel ),我想在JPanel上移动

代码语言:javascript
复制
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);

    }

}
EN

回答 1

Stack Overflow用户

发布于 2016-12-05 05:17:19

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

我必须将我的访问器注册到引擎:

代码语言:javascript
复制
Tween.registerAccessor(TweeningPane.class, new TweeningPane());

线程本身现在看起来像这样;我必须给管理器的update方法以参数的形式提供运行时间。

代码语言:javascript
复制
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();
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40954666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档