我想弄清楚如何为 Swing 组件设置动画以从点 a 移动到点 b。这是一个让红色 JPanel 从左向右移动的代码示例:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class MovingSquareExample {
private static final JPanel square = new JPanel();
private static int x = 20;
public static void createAndShowGUI(){
JFrame frame = new JFrame();
frame.getContentPane().setLayout(null);
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(square);
square.setBounds(20,200,100,100);
square.setBackground(Color.RED);
Timer timer = new Timer(1000/60,new MyActionListener());
timer.start();
frame.setVisible(true);
}
public static class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
square.setLocation(x++, 200);
}
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
createAndShowGUI();
}
});
}
}
还不错,就是我看起来有点波涛汹涌。带有可拖动正方形的类似示例的运动(参见 Draggable Components in Java Swing )看起来更平滑,所以我相信应该有办法让它看起来更好。任何建议将不胜感激。
最佳答案
您正在进入 Swing 库的棘手领域。然而,没有什么是不可能的。您可以使用 Timer 创建这样的动画,但我真的建议您不要这样做。所以你可以尽可能地移动组件,我建议你使用 Timing Framework图书馆。
但请注意:移动组件不是不经研究就应该做出的事情。开发了 Swing 布局,以便组件按特定顺序放置。如果您操纵组件的尺寸值和定位,您将破坏布局的功能,并且您的程序可能会以奇怪的方式运行。我遇到过在不使用布局的情况下在 Swing 中开发应用程序的情况。在操作系统中,我的程序似乎可以正常运行,但将其移植到其他系统时,一切都乱了套。因此,在启动具有此类自定义的 Swing 应用程序之前,您需要保持关注并执行许多测试。
这是 JavaFX 技术进入我们手中的原因之一。有了这样的技术,我们可以关注更少的事情(在不同的程序中部署应用程序)并做更多的事情(包括你遇到麻烦的那个)。考虑迁移到该技术。所以你看看JavaFX能做什么,下载演示程序Ensemble .如果你对这项技术产生兴趣,我建议你开始学习它here .如果不想下载demo,也可以找videos在互联网上演示其工作原理。
如果此替代方案对您来说太费力,请查看我提供给您的有关时序框架库的链接。在那里你会找到 Java 代码的例子,这些代码可以在各种 Swing 事物上以高性能制作流畅的动画。要学习如何使用这个库,我建议你拿本书 Filthy Rich Clients ,由 Chet Haase 和 Romain Guy 撰写。虽然这本书已经过时并且图书馆代码中的内容已更改,但您可以在 library website 上获得更新。 .正如我之前所说,下载库,同时下载代码示例。随着时间的推移,你最终会以最好的方式做你想做的事。
我希望你能完成你想要的。祝你好运。 :)
关于Java Swing : how to smoothly animate/move component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247776/