几天来,我一直在尝试创建一个JPanel,它是从侧面飞进来的。我找到了通用的补间引擎,也看了一些演示,但由于某种原因,我从来没有能够在我自己的代码中使它工作。为简单起见,让我们仅尝试将一个JPanel (在JLabel中包含一个图像)从JFrame上的(0,0)移动到(600,0)。这是我到目前为止得到的,也是我用这个框架实际移动过的最接近的东西,它所做的一切都是让JPanel在第一个滴答声中跳到它的目的地。它应该是如此简单,但我一定遗漏了什么……
SlideTest.java -创建UI,初始化线程+补间
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
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上移动
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);
}
}发布于 2016-12-05 05:17:19
我终于想通了。正如我所料,我只是以一种错误的方式使用了这个框架。我不确定是否需要所有这些步骤,但为了让它工作,我经历了以下步骤:(供将来参考)
我必须将我的访问器注册到引擎:
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();
}
}
}https://stackoverflow.com/questions/40954666
复制相似问题