Java中的简单动画

时间:2014-03-26 00:51:22

标签: java swing animation netbeans graphics

我试图在Java Swing应用程序中编写一个简单的动画或物理示例。我有实际的Windows应用程序打开和工作,但我无法弄清楚如何实际绘制我的形状,以及我如何格式化帧之间的计算代码,这种东西。

我已经阅读了一些关于过油漆方法的内容,但我不知道这意味着什么,我也不相信我在代码中使用它#&# 39;我现在正在使用。这是我的代码:

public class Physics extends JFrame{

public Physics() {

    initUI();
}

private void initUI() {
    JPanel panel = new JPanel();
    getContentPane().add(panel);

    panel.setLayout(null);

    final JLabel label = new JLabel("Hi, press the button to do something");
    label.setBounds(20, 0, 2000, 60);


    final JButton submitButton = new JButton("Start");
    submitButton.setBounds(20, 150, 80, 20);
    submitButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            //Put button code here later
        }
    });

    panel.add(label);
    panel.add(submitButton);

    setTitle("Program");
    setSize(300, 250);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Physics ex = new Physics();
            ex.setVisible(true);
        }
    });
}

}

所以我的按钮上方有一些空白区域,我想在屏幕上画一个正方形或圆形开始,一旦我把它弄下来,我就可以开始进入更高级的东西了。关于如何做到这一点的任何提示都会受到关注:D

谢谢!

4 个答案:

答案 0 :(得分:4)

查看Custom Painting上的Swing教程。

该示例向您展示如何进行绘画。如果您想要动画,那么您可以使用Swing Timer来安排动画。本教程还有一个关于How to use a Swing Timer的部分。

将两个教程放在一起,你就有了解决方案。

答案 1 :(得分:3)

  

“我读过一些关于过油漆方法的东西,但我不知道这意味着什么”

所以你已经覆盖了actionPerformed,所以你知道@Override是什么。正如您从ActionListener注意到的那样,您从未实际明确地调用actionPerformed,但无论您放在那里,仍然可以使用它。那是因为ActionListener隐含地为你调用它。

绘画也是如此。在Swing绘画过程中,Swing使用一个绘画链来绘制组件。一路上paint被称为某处。就像actionPerformed一样,您可以覆盖paint,它会被隐式调用。

@Override
public void paint(Graphics g) {
    super.paint(g);
}

传递给方法的Graphics对象是Swing将用于绘画的图形上下文。您可以查看Graphics API以查看可以使用的方法。您可以使用drawOval绘制圆圈

@Override
public void paint(Graphics g) {
    super.paint(g);
    g.drawOval(x, y, width, height);
}

现在就是这样。您实际上并不想覆盖paint。在上面链接的教程中,一些示例将使用applet并覆盖paint,但您不应该在顶级容器上绘制,如JFrameJApplet。而是在JPanelJComponent上绘画,然后将其添加到JFrame。当您在JPanelJComponent上进行 绘制时,您将覆盖paintComponent(也会在绘制链中调用),而不是{{1 }}

paint

您了解我如何使用@Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawOval(x, y, width, height); } 方法的变量。 drawOval是屏幕顶部的x位置,x和y点。 ywidth是圆的宽度和高度。使用变量的好处是它们的值可以在运行时更改。

这就是动画发挥作用的地方。如上所述,您使用javax.swing.Timer

基本构造是

height

public Timer(int delay, ActionListener listener) { } 是延迟每次调用侦听器的毫秒数。监听器将使用delay回调,每隔actionPerformed毫秒执行内部操作。所以你可以做的只是从delayx更改drawOval,它会动画。像

这样的东西
repaint()

您可以在构造函数中放入的计时器代码。这可能是我能给出的最简单的解释。希望能帮助到你。

不要忘记查看Custom PaintingGrapics2D以获取有关图形的更多高级主题。另请参阅计时器和动画here以及herehere以及herehere

的示例

还要避免使用null布局。请参阅Laying out Components Within a Container以了解如何使用布局管理器,就像使用Swing应用程序一样。

答案 2 :(得分:2)

有很多方法可以达到这个目的。

首先看看:

有关如何在Swing中完成绘画的详细信息。

动画不仅仅是暂停一小段时间然后重新绘制,加速和减速以及其他需要考虑的概念。

虽然您可以编写自己的,但这不是一项小任务,但更好的解决方案可能是使用预先存在的引擎,例如......

然后看看:

这些都是Swing中动画引擎的例子。虽然我更喜欢时序框架,因为它为我提供了一个较低级别的API,这是个人意见。 Trident和JUWE似乎都更倾向于基于组件/属性的动画(如果你想构建一些功能集,Timing Framework可以做到这一点)

答案 3 :(得分:1)

我制作了一个简单的动画,两个火箭爆炸了。完整的日食项目在这里:https://github.com/CoachEd/JavaExamples/tree/master/RaceToSpace。这是一个截图: enter image description here